java mysql 事务死锁

标签 java mysql innodb deadlock

我有一个这样的场景(半伪代码)

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/

相关文章:

java - 如何编写正则表达式捕获以某个参数结尾的任何 HREF?

mysql - SQL:从子查询和连接返回不同的相似值时遇到问题

php - 如何使用 InnoDB 表加速缓慢的 MySQL UPDATE 查询

mysql - InnoDB并发读写

mysql - 寻求分页查询在大表上逐渐变慢

mysql - 从 INNODB TABLE MONITOR OUTPUT 获取 CREATE TABLE 语句的工具?

java - 使用 javax.mail 读取本地 POP3 收件箱

java - Lucene自动查询转换的问题

Java语法查询

php - 使用 PHP 和 MySQL 隐藏包含特定字符串的行