【发布时间】:2015-12-18 19:18:11
【问题描述】:
我编写了一个 java 应用程序,其中不同的线程(每个线程都有一个使用连接池 c3p0 的连接对象)调用类似的方法。
伪代码:
void example(Connection connection) {
connection.update("LOCK TABLES Test WRITE");
resultSet = connection.query("SELECT * FROM Test WHERE Id = '5'");
if (resultSet.next()) {
connection.update("UPDATE Test SET Amount = '10' WHERE Id = '5'");
} else {
connection.update("INSERT INTO Test (Id, Amount) VALUES ('5', '10')");
}
connection.update("UNLOCK TABLES");
connection.commit();
}
还有一些其他类似的方法可以锁定表,选择/更新/插入某些内容,然后解锁表。目的是防止竞争条件和死锁。
当我从不同的线程调用这样的方法时,是否可能导致 MySQL 死锁?如果是的话,你能给我一个例子吗(导致死锁的两个事务的时间)?我是一个有死锁的菜鸟,我想进入这个。
编辑:明确应该在方法中使用的连接是从调用该方法的线程传递的。
编辑:将 READ 替换为 WRITE
【问题讨论】:
-
我假设“update()”和“query()”方法使用相同的连接(不是从池中获取新连接)。
-
@slambeth 是的,调用该方法的线程从池中获取连接对象并将其传递给该方法。该方法中的整个代码都使用此连接。自动提交为假。
-
@Jas 是的,我使用 InnoDB。
标签: java mysql multithreading transactions deadlock