死锁在多个连接会话中同时发生相同的数据库记录更新

时间:2010-10-01 07:11:12

标签: oracle deadlock

我们已实现基于客户端服务器套接字的应用程序来处理多个购物车请求。每天我们收到数以千计的购物车请求。

为此我们实现了多线程架构来同时处理请求。我们使用Oracle连接池进行数据库操作,并为连接池大小设置最佳值。根据我们的业务流程,我们有一个主数据库表,我们需要同时使用多个连接会话由多个线程更新同一组行。现在正在获得一些死锁问题,因为多个线程将尝试同时使用多个连接会话更新相同行上的数据,并且我们还是表上的一些其他主键冲突。有时,通过在多个连接会话中同时插入相同的数据,数据库也会被锁定。

请建议我立即处理上述问题的好方法。

1 个答案:

答案 0 :(得分:1)

编写不会遇到死锁的多线程代码有一些不同的通用解决方案。最简单的方法是确保始终以相同的顺序锁定资源。

当一个会话在A上持有一个锁并希望在B上锁定而另一个会话在B上持有一个锁并希望在A上锁定时发生死锁。如果确保您的代码始终在B之前锁定A(或B之前) A),您可以保证不会陷入僵局。

至于您对主键违规的评论,您是否使用Oracle序列之外的其他内容来生成主键?如果是这样,那几乎肯定是问题所在。 Oracle序列明确设计为在多个会话同时进行插入的情况下提供唯一的主键。