gpt4 book ai didi

Java sql 读+写 - 防止竞争条件?

转载 作者:太空宇宙 更新时间:2023-11-03 12:18:10 25 4
gpt4 key购买 nike

我有两个线程调用一个方法,该方法执行读取,然后写入 mysql 数据库中的记录。一些伪代码:

public void incrementRowValue() {
Connection conn = ...;
try {
conn.setAutoCommit(false);

int value = conn.execute("select value from foo where id = 123");
value += 1;
conn.execute("update foo set value = " + value + " where id = 123");

conn.commit();
}
catch (SQLException ex) {
conn.rollback();
}
finally {
conn.close();
}
}

因此,如果线程几乎同时执行,那么读+写似乎不是作为一个原子项执行的。例如,如果起始值为零,我的日志显示如果两个线程大约同时执行,则结束值可以是一而不是二。

我可以使用不同的锁定级别来防止这种情况发生吗?当然,如果需要,我可以在 Java 代码中进行同步,但我可能在这里遗漏了数据库级别为我们提供的一个重要功能。

谢谢

http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html

最佳答案

最简单的方法是将 SQL 封装到一个语句中,然后让 SQL 服务器处理它,我不记得手边的确切语法,但它应该是这样的:

    conn.execute("update foo set value = (select value from foo where id = 123)+1 where id = 123");  

SQL 服务器将锁定正在使用的行(如果使用多行将锁定所有行)并自动执行操作。

这也将更快/更有效,因为它只进行单个数据库调用而不是两个。不过,这种更新实际上可以包装到存储过程中。

关于Java sql 读+写 - 防止竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21207977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com