博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库update死锁
阅读量:6296 次
发布时间:2019-06-22

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

比较常见的死锁场景,并发批量update时的一个场景:
update cross_marketingset gmtModified = NOW(),pageview = pageview+ #extpageview#WHERE marketingId=#marketingId#

 

第一次调用时,marketingId传入值顺序: 1,
3,5,12
第二次调用时,marketingId传入值顺序:1,2,5,3
 
每次update时,会锁行。(一次批量操作为一个事务)
那么第一次调用时,顺序锁行,当更新完3,准备更新5的时候,发现5已经被第二次调用锁行了,就等待。而此时的第二次调用刚好更新完5准备去拿3的锁,却发现被第一次调用占有,于是就出现死锁。
 
所以,我们要在批量更新,更新操作的时候,按照一个固定的顺序来排序,然后进行操作。
前面的例子,如果按照marketingId从小到大排序,就会变成:
第一次调用时,marketingId传入值顺序: 1,3,5,12
第二次调用时,marketingId传入值顺序:1,2,3,5
如此,就避免了死锁的发生。

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

你可能感兴趣的文章
js中forEach的用法
查看>>
Docker之功能汇总
查看>>
!!a标签和button按钮只允许点击一次,防止重复提交
查看>>
(轉貼) Eclipse + CDT + MinGW 安裝方法 (C/C++) (gcc) (g++) (OS) (Windows)
查看>>
还原数据库
查看>>
作业调度框架 Quartz.NET 2.0 beta 发布
查看>>
mysql性能的检查和调优方法
查看>>
项目管理中的导向性
查看>>
Android WebView 学习
查看>>
(转)从给定的文本中,查找其中最长的重复子字符串的问题
查看>>
HDU 2159
查看>>
spring batch中用到的表
查看>>
资源文件夹res/raw和assets的使用
查看>>
UINode扩展
查看>>
LINUX常用命令
查看>>
百度云盘demo
查看>>
概率论与数理统计习题
查看>>
初学structs2,简单配置
查看>>
Laravel5.0学习--01 入门
查看>>
时间戳解读
查看>>