MYSQL 悲观锁和乐观锁简单介绍及实现

1:悲观锁

特点:

  每次查询都会进行锁行,怕“其他人”进行数据的修改。

实现步骤:

  步骤1:开启事务test1,并对id=2的记录进行查询,并加锁,如:

  

   步骤2:在事务test1没有进行commit的情况下,开启事务test2,并对id=2的记录进行修改,看执行结果

  

     最终执行结果显示获取锁超时。 

     而在获取锁的过程中,执行 show processlist 命令可以看到:修改id=2的sql命令一直在等待锁。

     而由于事务test1我没有commit,因此事务test2是获取不到锁的,因此就超时了。

   

  步骤3:当我事务test1进行commit之后,我在事务test2中进行id=2的记录的修改操作时会是什么情况:

扫描二维码关注公众号,回复: 11156022 查看本文章

  

     最终可以看到在事务test1进行commit之后,事务test2的修改操作终于成功了。

总结:

    在事务中执行 select * from table where id = ? for update 并没有进行commit时,id = ? 的记录将进行锁行,另外一个事务想要修改 id = ?  的记录将会一直阻塞直至事务超时。

2:乐观锁

特点:

  1:适用于读多于写的情况。

  2:不会锁行,乐观主义。

实现方式:

  常见的就是增加version字段或时间戳字段,每次修改都进行这个字段的更新。

那么如何解决多个人同时进行修改/新增/删除等操作时,最终只有一个执行成功?

我这里采用version的方式进行演示,测试步骤如下:

  1:事务1的 ddl:  

   

  2:事务2的 ddl:

  可以看到:当事务1和事务2同时修改id=2 and version = 1 的记录的时候,最终事务1成功修改,而到事务2进行修改时符合条件的记录以及不存在了,因此修改失败!!

  流程图如下:

  结果:通过控制version,可以合理的解决资源竞争问题。

     在日常开发中,可以利用事务的一致性,做更多的判断及操作。

猜你喜欢

转载自www.cnblogs.com/zgq7/p/12807943.html