java - 如何防止 JPA 插入锁定数据库表?

标签 java database hibernate jpa persistence

我使用 Hibernate 支持的 JPA 作为我的持久层。我有一个多线程进程,它聚合来自 Soap 调用的数据,然后将一行存储在数据库中。该过程通常以插入大约 700 行而告终,大约需要 1-3 小时,其中 Soap 调用是主要瓶颈。

在这整个过程中,我要插入的表被锁定,不会及时返回 select 语句。

这是 SQL 服务器错误:

Error Message: Lock request time out period exceeded.

如何避免在这个漫长的过程中锁定我的数据库表?

最佳答案

您可能需要更改隔离级别。

这里是一些信息: http://www.interview-questions-tips-forum.net/index.php/Your-Questions-on-Java/JDBC-Transaction/Transaction-Isolation-Levels

它讨论了不同的隔离级别,以及它们可以帮助防范的内容。执行此操作的一般方法是从严格主义者开始,如果您需要更好的响应时间,然后降低,同时牢记数据完整性/错误读取的要求。

编辑

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/

相关文章:

java - Spring Data Cassandra 自定义插入查询在字符串中的 '.' 处失败

.net - 哪种数据库模式最适合我的导航?

python - Microsoft SQL 中的错误 'String or binary data would be truncated'

database - 同步不同的数据库 - django

java - 创建自定义 Hibernate UserType - isMutable() 是什么意思?

java - 将嵌套的 ArrayList 转换为 List Java

java - 为什么 if 语句不能正常工作

java - 找出负数和正数之间的差异

java - 您是否需要在 Hibernate 表的 @id 列上创建索引

mysql - 如何使用Hibernate在一张表中存储由其他实体组成的实体?