我有一个这样的场景(半伪代码)
con.setAutoCommit(false);
try {
SELECT cash FROM bank_1 WHERE user = 1;
long money = rs.getLong("cash")
... if money >= the amount we want then...
UPDATE bank_1 SET cash=cash-money WHERE user = 1;
UPDATE bank_2 SET cash=cash+money WHERE user = 2;
con.commit();
} catch(Exception e1) {
con.rollBack();
} finally {
con.setAutoCommit(true);
try { con.close(); } catch(Exception e) { }
}
然后我必须同时在另一个程序中执行相反的操作才能从第二家银行转账到第一家银行,所以 在这种情况下如何避免僵局?
最佳答案
在事务中任何 SELECT
的末尾添加 FOR UPDATE
。
SELECT cash FROM bank_1 WHERE user = 1 FOR UPDATE;
这会锁定其中提到的行,以便其他连接在此事务完成之前不会干扰该行。
(有些情况下不需要FOR UPDATE
,但这是一个较长的讨论。)
关于java mysql 事务死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69684200/