我的朋友描述了一个场景,并挑战我找到解决方案。他正在使用Oracle数据库和JDBC连接,并将读取提交为事务隔离级别。在其中一个交易中,他更新记录,执行选择语句并提交交易。当一切发生在一个线程内时,事情都很好。但是,当处理多个请求时,发生死锁。JDBC事务死锁:需要解决方案吗?
- 线程A更新记录。
- 线程B更新另一条记录。
- 线程A发出select语句并等待线程B的事务完成提交操作。
- 线程B发出select语句并等待线程A的事务完成提交操作。
以上原因导致死锁。由于它们使用命令模式,因此基本框架只允许发出一次提交(在所有数据库操作结束时),因此它们无法在选择语句之前立即发出提交。
我的论点是:线程-A应该选择所有提交的记录,因此不应该发布。但他表示,线程A肯定会等到线程B提交记录。真的吗?
什么是所有的方式,以避免上述问题?是否有可能改变隔离级别(不改变底层java框架)?
有关基本框架的一些信息:它与Struts动作类似,每个请求都由一个动作处理,事务在执行前开始并在执行后提交。
我不明白“等待......交易完成”,因为在Oracle读取提交时,读者不会阻止作者和作者不会阻止读者。 – davek 2010-04-03 16:14:06