Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 死锁在多个连接会话中同时发生相同的数据库记录更新_Oracle_Deadlock - Fatal编程技术网

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

Oracle 死锁在多个连接会话中同时发生相同的数据库记录更新,oracle,deadlock,Oracle,Deadlock,我们已经实现了基于客户机-服务器套接字的应用程序来处理多个购物车请求。每天我们都会收到成千上万的购物车请求 为此,我们实现了多线程体系结构来并发处理请求。我们使用Oracle连接池进行数据库操作,并为连接池大小设置了最佳值。根据我们的业务流程,我们有一个主数据库表,我们需要同时使用多个连接会话由多个线程更新同一组行。现在我们遇到了一些死锁问题,因为多个线程将尝试同时使用多个连接会话更新同一行上的数据,而且我们还遇到了一些其他表上的主键冲突。有时,数据库也会通过同时在多个连接会话中插入相同的数据而

我们已经实现了基于客户机-服务器套接字的应用程序来处理多个购物车请求。每天我们都会收到成千上万的购物车请求

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


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

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

当一个会话持有A上的锁并希望获得B上的锁,而另一个会话持有B上的锁并希望获得A上的锁时,就会发生死锁。如果您确保代码总是在B之前锁定A(或在A之前锁定B),则可以保证不会发生死锁


至于您对主键冲突的评论,您是否使用Oracle序列以外的其他方法来生成主键?如果是这样,几乎可以肯定这就是问题所在。Oracle序列被明确设计为在多个会话同时执行插入时提供唯一的主键。

如果您能向我们展示一些代码,这将有助于。。。一般来说,如果您必须更新相同的数据,这些操作将被序列化…感谢您的及时响应。我们在每个线程的特定代码段上实现了一些等待和通知机制。通过这种方法,死锁不会发生。但这种方法的缺点是,如果任何线程占用大量时间,这将影响其他线程,因为此进程将是串行方式。如果我们在存储过程中写入所有的数据库操作,当所有线程访问这个存储过程时,它是否为每个线程设置了锁?我们在子表中得到了一些主要的冲突,而不是在父表中。对于这个问题,我们将通过再次运行进程来解决。主要问题是当每个线程试图同时在每个不同的连接会话中插入或更新数据子表时,数据库被锁定。甚至有时系统也会被绞死。我们正在批量添加所有insert或update sql语句。实际上,在这个场景中,我们应该得到死锁,但数据库不会抛出任何异常。对于这个过程,我们没有实现上面的等待和通知机制。