我编写了一个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死锁?如果是的话,你能举个例子说明这是怎么回事(导致死锁的两个交易的时间)?我是一个有僵局的菜鸟,我想进入这个。
编辑:明确表示应该在方法中使用的连接是从调用该方法的线程传递的。
编辑:用WRITE替换READ
答案 0 :(得分:1)
它不能在这里。由于没有复杂的逻辑,并且代码在更新后立即提交,因此必须始终有一个线程通过。即使在更复杂的场景中,它可能需要最高的序列化级别(可重复读取),我相信MySql不支持。
答案 1 :(得分:1)
这可能会造成死锁。实际上我不确定它是否会执行,因为你需要获得一个“WRITE”锁,而不是“READ”。