悲观锁_乐观锁

悲观锁和乐观锁使用场景

乐观锁是在应用层加锁,而悲观锁是在数据库层加锁(for update)

乐观锁顾名思义就是在操做时很乐观,这数据只有我在用,我先尽管用,最后发现不行时就回滚。

悲观锁在操做时很悲观,生怕数据被其余人更新掉,我就先将其先锁住,让别人用不了,我操做完成后再释放掉。

悲观锁须要数据库级别上的的实现,程序中是作不到的,若是在长事务环境中,数据会一直被锁住,致使并发性能大大地下降。

通常来讲若是并发量很高的话,建议使用悲观锁,不然的话就使用乐观锁。

若是并发量很高时使用乐观锁的话,会致使不少的并发事务回滚、操做失败。

总之,冲突概率大用悲观,小就用乐观。

悲观锁通常是用于并发不是很高,而且不容许脏读等状况。可是对数据库资源消耗较大

悲观锁
当一个事务锁定了一些数据以后,只有当当前锁提交了事务,释放了锁,其余事务才能得到锁并执行操做
使用方式以下:
首先要关闭MySQL的自动提交:set autocommit = 0;
这里使用select for update的方式利用数据库开启了悲观锁,锁定了id=1的这条数据(注意:这里除非是使用了索引会启用行级锁,否则是会使用表锁,将整张表都锁住。)。
以后使用commit提交事务并释放锁,这样下一个线程过来拿到的就是正确的数据。

悲观锁通常是用于并发不是很高,而且不容许脏读等状况。可是对数据库资源消耗较大。

咱们可使用命令设置MySQL为非autocommit模式
set autocommit=0;
//0.开始事务
begin;/begin work;/start transaction; (三者选一就能够)
//1.查询出商品信
select status from t_goods where id = #{id} for update;
//2.根据商品信息生成订单
insert into t_orders (id,goods_id) values (null,1);
//3.修改商品status为2
update t_goods set status=2;
//4.提交事务
commit;/commit work;

乐观锁
一般的实现方式增长一个version字段,为每一条数据加上版本。每次更新的时候version+1,而且更新时候带上版本号。实现方式以下:
版本号(version)
UPDATE price_version
SET front = #{front,jdbcType=DECIMAL},
version= version + 1
WHERE id = #{id,jdbcType=INTEGER}
AND version = #{version,jdbcType=INTEGER}数据库

相关文章
相关标签/搜索