博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql线程保护_mysql事务隔离的问题?多线程并发怎么保证可靠?
阅读量:5742 次
发布时间:2019-06-18

本文共 802 字,大约阅读时间需要 2 分钟。

通过试验,发现某种程度上已经理解了自己的问题。

我之前被关于事务隔离级别错误信息误导,认为REPEATABLE-READ级别和SERIALIZABLE级别能解决丢失更新的问题,然而实际是不能的。

因为mysql的select ... from table;语句 不管哪种隔离级别都是不会阻塞的,

事务A读取 id为1 number = 3 ,执行更新操作 number设为1;

事务B读取 id为1 number = 3, 执行+1操作 更新--进入阻塞

在隔离级别下只有在更新数据时才会等待写锁(排它锁)的释放,所以我多个线程可以同时读取到number=3,基于此进行修改就必然会导致丢失更新。

所以解决办法为程序中加入悲观锁 或 乐观锁 机制。

悲观锁采用的是 select ... for update,

事务A: select ... for update,执行更新操作,

事务B: select ... for update --阻塞

这时事务B读取操作将无法执行,只有当事务A的commit完成,事务B才可以继续执行,相当于采用串行一个个执行。

乐观锁常用的是版本控制或时间戳控制,

事务A:执行 此时版本为 1;执行完update ...set version=2 where version = 1;

事务B:执行 此时版本为 1;执行完update ...set version=2 where version = 1;

这时候事务B发现version=1已经不存在了,因为事务A首先执行完更新了数据库,把version字段设为了2,这样就会导致该事务提交失败,需要我们在程序中判断异常情况下如何继续操作。

以上就是我当前的理解,至于mysql本身支持的MVCC(多版本并发控制)还不知道怎么用,乐观锁的异常处理也不太清楚具体要怎么实现,可能是要根据具体的业务场景采用不同的处理手段吧。

转载地址:http://wfnzx.baihongyu.com/

你可能感兴趣的文章
设计模式之抽象工厂模式
查看>>
MAVEN 属性定义与使用
查看>>
hadoop2.7.2 HA搭建
查看>>
gitosc上传项目
查看>>
Java-UrlRewrite中文官方文档
查看>>
C++随笔:.NET CoreCLR之corleCLR核心探索之coreconsole(2)
查看>>
js中replace的用法(两种常用举例,还有好多用法不一一列举)
查看>>
基于开源云平台OpenStack的存储分析
查看>>
关于Android Sqlite语句注意事项一点
查看>>
shell高级视频答学生while循环问题
查看>>
无法SSH到Ubuntu
查看>>
使用@media实现IE hack的方法
查看>>
磁盘管理 - 软RAID
查看>>
KVM下virtio驱动虚拟机XML配置文件分析
查看>>
创建一个基本镜像
查看>>
《11招玩转网络安全》之第一招:Docker For Docker
查看>>
7、kvm虚拟机快照备份
查看>>
visual studio 2005没有找到MSVCR80D.dll问题
查看>>
hive_0.11中文用户手册
查看>>
hiveserver2修改线程数
查看>>