首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新SELECT中的数据库死锁

更新SELECT中的数据库死锁
EN

Stack Overflow用户
提问于 2013-10-11 17:51:20
回答 1查看 10.4K关注 0票数 6

我的应用程序正间歇性地陷入死锁。我的应用程序有一个表,例如EMPLOYEE (ID (PK)、NAME、SAL),并且有两个会话。

第1场会议:

代码语言:javascript
复制
SELECT ID, NAME, SAL FROM EMPLOYEE WHERE SAL = (SELECT MIN(SAL) FROM 
EMPLOYEE) FOR UPDATE
Let say the query return EMPLOYEE ROW having ID=2
then application does some processing like rs.updateInt(ID_SAL, 10);

会话2:(用于其他业务逻辑)

代码语言:javascript
复制
SELECT ID, NAME, SAL FROM EMPLOYEE WHERE ID=2 FOR UPDATE.

因此,在应用程序中,两个会话都试图更新同一行(例如,使用ID=2的行),这种情况是预期的,因此我认为选择..。更新会有帮助。

我做错了什么吗?我假设SELECT FOR UPDATE将锁定该行,当其他会话尝试更新同一行时,它将等待会话1完成执行。

EN

回答 1

Stack Overflow用户

发布于 2013-10-11 18:02:19

我假设SELECT FOR UPDATE将锁定该行,当其他会话尝试更新同一行时,它将等待会话1完成执行。

正是如此。但是,在结束此行或关闭会话时,您需要关闭事务。您的问题可能出现的情况是:

Process 1用ID=2锁行,更新它,然后用ID=1 (但是会话和事务仍然是活动的)处理2已经用ID=1锁定的行,然后用ID=2锁定行(但是会话和事务仍然是活动的)

因此,流程1正在等待记录ID=1并保存记录ID=2。

进程2正在等待记录ID=2并保存记录ID=1。

这是一把死锁。您必须在使用记录完成工作后完成事务处理,以便将其释放给其他进程。

如果您需要在一个事务中更新多条记录,只需将它们全部锁在一起,并在工作完成后释放。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19324347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档