Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Java中的多线程导致表锁_Java_Multithreading_Oracle_Table Locking_Global Temp Tables - Fatal编程技术网

Java中的多线程导致表锁

Java中的多线程导致表锁,java,multithreading,oracle,table-locking,global-temp-tables,Java,Multithreading,Oracle,Table Locking,Global Temp Tables,我正在使用batchUpdate将数据插入到Oracle表中。五个不同的并行线程正在调用batchUpdate方法以插入到单个表中。 表是全局临时表类型 程序执行未完成,在建立数据库连接后被卡住 在单个全局临时表上运行的多个线程是否会导致表锁定并阻止程序的执行 我可以使用下面的查询查看锁定的表- select object_name, object_type from all_objects where object_id in (select object_id from v$locked_

我正在使用batchUpdate将数据插入到Oracle表中。五个不同的并行线程正在调用batchUpdate方法以插入到单个表中。 表是全局临时表类型

程序执行未完成,在建立数据库连接后被卡住

在单个全局临时表上运行的多个线程是否会导致表锁定并阻止程序的执行

我可以使用下面的查询查看锁定的表-

 select object_name, object_type from all_objects where object_id in (select object_id from v$locked_object);
是的,他们会的

如果两个不同的会话同时更新同一个表,则第二个会话将无法访问该表,直到完成第一个表的更新(执行提交)。 第一个会话实际上会在该表上部署一个“锁”,直到完成更新

你不能用两个线程在完全相同的时间更新完全相同的数据块,是吗


这是ORACLE维护数据一致性的功能。

请发送该查询的输出。Oracle支持多种类型的锁。其中一些可以共享(例如TM)。在v$locked_对象视图中看到某些内容并不意味着某些会话被阻止


最有可能的情况是,您的表仅针对DDL(ALTERTABLE)语句被锁定。但不适用于DML。

为什么是五个线程?为什么不让一个线程执行插入,而让另外五个“推”值执行?是阻塞还是锁定?假设第一个线程提交事务,那么第二个线程应该能够完成它的工作。否则数据池将如何工作。线程是否每个都有一个连接/会话,或者它们是否共享并竞争同一个连接/会话?如果它真的是GTT,那么会话就不应该相互干扰,因为它们只看到自己的数据。可能有一个线程持有一个连接,而其他四个线程正在等待,在Java级别上,而不是在DB中?@fge有5000条记录要插入。因此,将其分为5个部分,并使用5个平行螺纹插入,以提高性能。它是在保存会话下完成的。我怀疑在同一个会话中,一个线程可能会导致另一个线程的表锁。@我可能会在单个事务中想到它。一旦所有5个线程都执行了,提交就完成了。不过,更新全局临时表的两个会话只能看到它们自己的数据,所以听起来像是多个线程访问同一个连接/会话?如果它真的是GTT。