Dan*_*Zen 3 sql database-deadlocks sql-update
我的申请中间歇性地陷入僵局.我的应用程序有1个表,例如EMPLOYEE(ID(PK),NAME,SAL),有2个会话.
第一节:
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);
Run Code Online (Sandbox Code Playgroud)
第2节:(针对其他业务逻辑)
SELECT ID, NAME, SAL FROM EMPLOYEE WHERE ID=2 FOR UPDATE.
Run Code Online (Sandbox Code Playgroud)
因此,在应用程序中,两个会话都尝试更新同一行(在ID = 2的示例行中)这种情况是预期的,因此我认为SELECT .. FOR UPDATE将有所帮助.
难道我做错了什么?我假设SELECT FOR UPDATE将锁定该行,当其他会话将尝试更新同一行时,它将等待会话1完成执行.
我假设SELECT FOR UPDATE将锁定该行,当其他会话将尝试更新同一行时,它将等待会话1完成执行.
这是确切的.但是,当您完成此行或关闭会话时,您需要关闭事务.您的问题的可能情况是下一个:
进程1锁定ID = 2的行,更新它并转到ID = 1的下一条记录(但会话和事务仍处于活动状态)进程2已锁定行ID = 1并且将锁定ID = 2的行(但是会话和交易仍然有效)
因此,进程1正在等待记录ID = 1并保持记录ID = 2
进程2正在等待记录ID = 2并保持记录ID = 1
这是一个死锁.在完成记录工作后,您必须完成事务以将其释放给其他进程.
如果您需要在一个事务中更新多个记录,只需将它们全部锁定在一起,并在工作完成后释放.
| 归档时间: |
|
| 查看次数: |
6530 次 |
| 最近记录: |