我使用 Hibernate 支持的 JPA 作为我的持久层。我有一个多线程进程,它聚合来自 Soap 调用的数据,然后将一行存储在数据库中。该过程通常以插入大约 700 行而告终,大约需要 1-3 小时,其中 Soap 调用是主要瓶颈。
在这整个过程中,我要插入的表被锁定,不会及时返回 select 语句。
这是 SQL 服务器错误:
Error Message: Lock request time out period exceeded.
如何避免在这个漫长的过程中锁定我的数据库表?
最佳答案
您可能需要更改隔离级别。
它讨论了不同的隔离级别,以及它们可以帮助防范的内容。执行此操作的一般方法是从严格主义者开始,如果您需要更好的响应时间,然后降低,同时牢记数据完整性/错误读取的要求。
编辑
Spring 事务级别用于在事务管理器中抽象 JDBC(或其他)事务隔离级别。它们在 TransactionDefinition 中定义类,并且是静态成员。
TransactionDefinition.ISOLATION_DEFAULT
Default isolation
TransactionDefinition.ISOLATION_READ_UNCOMMITTED
Lowest level of isolation; allows transactions to see uncommitted modifications from other transactions
TransactionDefinition.ISOLATION_READ_COMITTED
Cannot read uncommitted data
TransactionDefinition.ISOLATION_REPEATABLE_READ
Ensures repeatable reads
TransactionDefinition.ISOLATION_SERIALIZABLE
Most reliable; all transactions are executed atomically, and are treated as though they occurred serially.
还有事务传播级别。您可能将事务用于纯读取,这可能有点矫枉过正 - 读取不需要事务,写入应该始终围绕它们进行事务。传播级别在 TransactionDefinition 中也是确定的。通常在 spring 布线文件中使用这些来定义特定调用的序列化和传播。如果您有接线示例,我也许可以提供更多提示/信息。
关于java - 如何防止 JPA 插入锁定数据库表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1208936/