程序员

MySQL中的锁(行锁,表锁,乐观锁,悲观锁,共享锁,排他锁)

2018-05-14  本文已影响280人  小新是个程序媛

1. 行锁

给某一行记录上锁,目前只有InnoDB引擎支持行锁

2. 表锁

给一个整张表上锁

3. 乐观锁

本身很乐观,认为在操作数据时(更新操作),默认别的线程并不会操作数据发生冲突,所以在每次操作时并不会上锁,只是在更新时判断别的线程在此期间是否有做修改,如果有修改该操作就无效

通常实现是这样的:在表中的数据进行操作时(更新),先给数据表加一个版本(version)字段,每操作一次,将那条记录的版本号加1。也就是先查询出那条记录,获取出version字段,如果要对那条记录进行操作(更新),则先判断此刻version的值是否与刚刚查询出来时的version的值相等,如果相等,则说明这段期间,没有其他程序对其进行操作,则可以执行更新,将version字段的值加1;如果更新时发现此刻的version值与刚刚获取出来的version的值不相等,则说明这段期间已经有其他程序对其进行操作了,则不进行更新操作。

#1.查询出商品信息
select (status,status,version) from t_goods where id=#{id}

#2.修改商品status为2
set status=2,version=version+1 where id=#{id} and version=#{version};

4. 悲观锁

(大多数情况下依靠数据库的锁机制实现,开销比较大)
本身很悲观,认为在操作数据时总会发生冲突,所以在每次操作时都需要给相应的数据加上锁来避免冲突,所以悲观锁比较耗时,另外与乐观锁不同悲观锁是由数据库自己实现的,所以要用的时候可以直接调用数据库的相关语句.
共享锁和排他锁是悲观锁的不同实现,但都属于悲观锁

上一篇下一篇

猜你喜欢

热点阅读