标签:行锁 字段 state 线程 关于 思考 Mysql 激活 操作
目录
1. 使用@Async多线程操作数据库担心数据不一致引发的思考
1. 使用@Async多线程操作数据库担心数据不一致引发的思考
其实这个问题一些新手CRUD程序员也会想到, 下面我模拟一个场景简单还原一下
问题还原: 现存在一张mysql的表, 表中有state字段表示状态(激活\非激活\激活中), 现在需要一个异步的方法去执行激活操作. 执行前需要判断该行state字段是否处于[非激活]状态, 若处于[非激活状态]则进行激活操作, 然后将状态设设置为[激活中], 等激活完成后更新状态为[已激活], 否则不进行激活操作.
我的担心: 因为该操作是异步的, 假设有A和B两个线程, 如果A线程执行激活操作, 那么程序会去执行更新操作: 将state更新为[激活中], 我担心的是更新state字段为[激活中]这套动作还没完成时, B线程读取了该行state字段, 结果肯定是[非激活], 然后B线程也会执行激活操作, 这样A和B线程都执行了激活操作, 这样就存在问题了. 如果这个操作不是激活而是其他操作比如转账, 这样就肯定不行了.
解决方案: 查阅了相关资料比如这位老铁的文章就讲的很好, 这个图片我是太喜欢了搬过来装装B
图片来自:weixin_39559071
还有这篇关于行锁的介绍, 还有这位老哥的文章描述了一些行锁需要避免的坑, 还有这位大佬, 写的都很好, 让我受益匪浅, 我就不造轮子了, 在这引用weixin_39559071 中的一句过来方便回忆翻阅
对于UPDATE、DELETE、INSERT语句,InnoDB会自动给涉及数据集加排他锁(X) MyISAM在执行查询语句SELECT前,会自动给涉及的所有表加读锁,在执行增、删、改操作前,会自动给涉及的表加写锁,这个过程并不需要用户干预
这样看来我的担心就是多余的啦, 因为InnoDB会自动添加行锁, 那么上述的担心:A线程更新state字段操作未完成, 因为行锁存在, B线程只能乖乖等A线程更新state字段完成四释放锁后才能进行读取.
标签:行锁,字段,state,线程,关于,思考,Mysql,激活,操作 来源: https://blog.csdn.net/Li_haiyu/article/details/119301994
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。