我已经阅读了本教程:http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html,但我想我仍然缺少一些东西。
让我们举个例子:
线程T1有自己的连接
线程T2具有自己的连接
因此,这些线程执行事务(在两个不同的连接上执行setAutoCommit(false))。此事务在单个数据库表上执行以下查询:
选择一行以读取一个递增数字(PN)
插入一行,将递增编号设置为:PN ++(我已经
阅读+1)
在此表中,累进编号必须是唯一的(它是主键)。
JDBC事务(具有TRANSACTION_READ_COMMITTED隔离级别)是否可以避免T1和T2读取相同的PN值并且都试图在表中插入相同的PN ++的问题?在执行插入并调用commit()之前,表是否已锁定?
最佳答案
不,为了确保您始终拥有唯一的号码,您需要:
1)[更好]取决于数据库,将数据库字段更改为标识/序列/自动编号
2)使用UUID作为标识符
3)[最差]在读取/递增/写入序列的持续时间内锁定行
TRANSACTION_READ_COMMITTED将仅确保您只能读取已经提交给数据库的数据。即如果您之间还有200次DB操作
UPDATE sequence
和
commit
在提交之前,其他线程将无法读取您更新的数据,因此实际上,它所做的与您想要的相反。