关于update语句产生的死锁问题,求助
发布网友
发布时间:2022-04-23 00:13
我来回答
共2个回答
懂视网
时间:2022-04-29 23:11
cross_marketing
set 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
如此,就避免了死锁的发生。
数据库update死锁
标签:
热心网友
时间:2022-04-29 20:19
数据库死锁现象
程序执行程点击确定或保存按钮程序没响应没现报错
二、死锁原理
于数据库某表某列做更新或删除等操作执行完毕该条语句提
交另条于列数据做更新操作语句执行候处于等待状态
现象条语句直执行直没执行功没报错
三、死锁定位
通检查数据库表能够检查哪条语句死锁产死锁机器哪台
1)用dba用户执行语句
select username,lockwait,status,machine,program from v$session where sid in
(select session_id from v$locked_object)
输结则说明死锁且能看死锁机器哪台字段说明:
Username:死锁语句所用数据库用户;
Lockwait:死锁状态内容表示死锁
Status: 状态active表示死锁
Machine: 死锁语句所机器
Program: 产死锁语句主要自哪应用程序
2)用dba用户执行语句查看死锁语句
select sql_text from v$sql where hash_value in
(select sql_hash_value from v$session where sid in
(select session_id from v$locked_object))
四、死锁解决
般情况要产死锁语句提交实际执行程用户
能知道产死锁语句哪句程序关闭并重新启
经Oracle使用程碰问题所总结点解决
1)查找死锁进程:
sqlplus "/as sysdba" (sys/change_on_install)
SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;
2)kill掉死锁进程:
alter system kill session ‘sid,serial#’; (其sid=l.session_id)
3)能解决:
select pro.spid from v$session ses,v$process pro where ses.sid=XX and ses.paddr=pro.addr;
其sid用死锁sid替换: exit
ps -ef|grep spid
其spid进程进程号kill掉Oracle进程