Java MySQL可能导致死锁?

时间:2015-12-18 19:18:11

标签: java mysql multithreading transactions deadlock

我编写了一个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

2 个答案:

答案 0 :(得分:1)

它不能在这里。由于没有复杂的逻辑,并且代码在更新后立即提交,因此必须始终有一个线程通过。即使在更复杂的场景中,它可能需要最高的序列化级别(可重复读取),我相信MySql不支持。

答案 1 :(得分:1)

这可能会造成死锁。实际上我不确定它是否会执行,因为你需要获得一个“WRITE”锁,而不是“READ”。