我的应用程序正间歇性地陷入死锁。我的应用程序有一个表,例如EMPLOYEE (ID (PK)、NAME、SAL),并且有两个会话。
第1场会议:
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:(用于其他业务逻辑)
SELECT ID, NAME, SAL FROM EMPLOYEE WHERE ID=2 FOR UPDATE.因此,在应用程序中,两个会话都试图更新同一行(例如,使用ID=2的行),这种情况是预期的,因此我认为选择..。更新会有帮助。
我做错了什么吗?我假设SELECT FOR UPDATE将锁定该行,当其他会话尝试更新同一行时,它将等待会话1完成执行。
发布于 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。
这是一把死锁。您必须在使用记录完成工作后完成事务处理,以便将其释放给其他进程。
如果您需要在一个事务中更新多条记录,只需将它们全部锁在一起,并在工作完成后释放。
https://stackoverflow.com/questions/19324347
复制相似问题