我的朋友描述了一个场景,并向我提出了挑战,让我找到解决方案。他正在使用Oracle数据库和JDBC连接,隔离级别为读提交。在其中一个事务中,他更新了一条记录,执行了一个查询语句并提交了事务。当所有操作都在一个线程中进行时,一切正常。但是当处理多个请求时,会发生死锁。
以下是导致死锁的步骤:
1. 线程A更新记录。 2. 线程B更新另一条记录。 3. 线程A发出select语句并等待线程B的事务完成提交操作。 4. 线程B发出select语句并等待线程A的事务完成提交操作。
由于使用了命令模式,基础框架只允许在所有db操作结束之前仅发出一次提交指令,因此无法在查询语句之前立即发出提交指令。
我的观点是:线程A应该选择已经提交的所有记录,因此不应该发出select语句。但是他说线程A肯定会等待线程B提交记录。这是真的吗?
有哪些方法可以避免上述问题?是否可以更改隔离级别(而不更改底层Java框架)?
关于基础框架的一些信息:它类似于Struts操作,每个请求都由一个操作处理,事务在执行前开始,在执行后提交。
以下是导致死锁的步骤:
1. 线程A更新记录。 2. 线程B更新另一条记录。 3. 线程A发出select语句并等待线程B的事务完成提交操作。 4. 线程B发出select语句并等待线程A的事务完成提交操作。
由于使用了命令模式,基础框架只允许在所有db操作结束之前仅发出一次提交指令,因此无法在查询语句之前立即发出提交指令。
我的观点是:线程A应该选择已经提交的所有记录,因此不应该发出select语句。但是他说线程A肯定会等待线程B提交记录。这是真的吗?
有哪些方法可以避免上述问题?是否可以更改隔离级别(而不更改底层Java框架)?
关于基础框架的一些信息:它类似于Struts操作,每个请求都由一个操作处理,事务在执行前开始,在执行后提交。