Java JDBC事务死锁:需要解决方案吗?
我的朋友描述了一个场景,并要求我找到解决方案。他使用的是Oracle数据库和JDBC连接,读取提交作为事务隔离级别。在其中一个事务中,他更新记录,执行select语句并提交事务。当所有事情都发生在一个线程中时,一切都很好。但当处理多个请求时,就会出现死锁Java JDBC事务死锁:需要解决方案吗?,java,oracle,jdbc,transactions,deadlock,Java,Oracle,Jdbc,Transactions,Deadlock,我的朋友描述了一个场景,并要求我找到解决方案。他使用的是Oracle数据库和JDBC连接,读取提交作为事务隔离级别。在其中一个事务中,他更新记录,执行select语句并提交事务。当所有事情都发生在一个线程中时,一切都很好。但当处理多个请求时,就会出现死锁 线程A更新记录 线程B更新另一条记录 线程A发出select语句并等待线程B的事务完成提交操作 线程B发出select语句并等待线程A的事务完成提交操作 上述情况会导致死锁。由于它们使用命令模式,基本框架只允许发出一次commit(在所有db操
如果选择更新其他线程已更新(但尚未提交)的记录,我相信您的朋友是正确的。如果他们只是选择数据,而JDBC框架没有通过强制选择更新来帮助您,那么您是正确的 若要避免此问题,请确保仅在确实需要时才选择更新,在这种情况下,请使用“选择”对话框中的NOWAIT选项。如果操作将被阻止,这将导致引发错误
Oracle将检测死锁并回滚其中一个涉及的事务。Oracle中不会出现这种情况,原因很简单,即写入不会阻止该数据库中的读取 我们可以在以下场景中获得死锁:
SELECT…FOR UPDATE
)。在web应用程序中,通过使用“乐观锁列”可以避免这种情况,而“乐观锁列”实际上根本不是锁的形式(这就是为什么它可以避免死锁,尽管会以大量额外读取为代价) 我不理解“等待…事务完成”的含义,因为在Oracle中,读取提交后,读卡器不会阻止写入程序,写入程序也不会阻止读卡器。