关于Mysql的乐观锁

在Mysql的使用有一个概念,乐观锁和悲观锁,用于解决数据的同步更新问题,网上有很多关于乐观锁和悲观锁的介绍,但是本人感觉在乐观锁的介绍上差了那么一句最关键的话,导致理解和使用一直不得其法,还是先介绍下大的概念吧

 

悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度(悲观),因此,在整个数据处理过程中,将数据处于锁定状态。 悲观锁的实现,往往依靠数据库提供的锁机制 (也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)

悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会;另外,在只读型事务处理中由于不会产生冲突,也没必要使用锁,这样做只能增加系统负载;还有会降低了并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数


在关系数据库管理系统里,乐观并发控制(又名“乐观锁”,Optimistic Concurrency 
Control,缩写“OCC”)是一种并发控制的方法。它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,正在提交的事务会进行回滚

 

其实这里面最关键的就是一句话,在update的时候需要先判断版本号,当版本号与期望一致时才进行update,这里的一致与更新必须是在一起执行的,而不是获取了版本号,然后if,else判断,成功再更新,这样在多线程环境下还是会出问题,当你if判断成功,还没有update时另一个线程也获取版本号进行判断也会通过,那也两个更新操作都会成功,而其中一个会被覆盖掉。所以正确的做法是在sql中update操作的时候在where条件的地方加上版本字段的相等限制,例如:

update  XXTable  set  column1=#{col1},column2=#{col2},version=#{新version} where version=#{初始version}

这里是有一个默认的规则的,就是执行update操作某一行数据的时候会把更新行数据锁定,其它同行的update就会无法获取锁而不能执行更新

一个原则,当更新冲突几率大用悲观锁,几率小时用乐观锁,性能高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值