我们有一个正在修改记录的事务。该事务必须调用Web服务,如果服务失败,则回滚该事务(因此不能在提交之前提交)。由于记录已经被修改,客户端应用程序对其进行了锁定。但是,Web服务必须检索该记录以获取其中的信息作为其处理的一部分。嘭,死锁。
我们使用WebSphere,默认情况下使用可重复读取隔离级别,原因令人费解。我们将其降低到read_committed,认为这将检索到行而不寻求锁定。在我们的开发环境中,似乎可以工作,但在暂存期间,我们遇到了死锁问题。
我不是在问它为什么表现不同,我们可能犯了错误。我也没有询问上面Web服务示例的具体细节,因为显然这种情况可能会发生在其他地方。
但是根据阅读文档,read_committed在读取期间确实会获取共享锁,并因此等待另一个事务(在本例中为客户端应用程序)持有的排他锁。但是,我不想进入read_uncommitted隔离级别,因为我不想要脏读。有没有一个稍微缓和的解决方案?我需要一些中间状态,可以执行读取而不等待任何锁定,并仅检索已提交的数据。
有没有这样的解决方案?不太容易死锁,也不太容易脏读?如果在隔离级别中没有,则可以对SQL添加一些修饰符吗?还有其他的吗?
我们使用WebSphere,默认情况下使用可重复读取隔离级别,原因令人费解。我们将其降低到read_committed,认为这将检索到行而不寻求锁定。在我们的开发环境中,似乎可以工作,但在暂存期间,我们遇到了死锁问题。
我不是在问它为什么表现不同,我们可能犯了错误。我也没有询问上面Web服务示例的具体细节,因为显然这种情况可能会发生在其他地方。
但是根据阅读文档,read_committed在读取期间确实会获取共享锁,并因此等待另一个事务(在本例中为客户端应用程序)持有的排他锁。但是,我不想进入read_uncommitted隔离级别,因为我不想要脏读。有没有一个稍微缓和的解决方案?我需要一些中间状态,可以执行读取而不等待任何锁定,并仅检索已提交的数据。
有没有这样的解决方案?不太容易死锁,也不太容易脏读?如果在隔离级别中没有,则可以对SQL添加一些修饰符吗?还有其他的吗?