我该如何防止JPA插入操作锁定数据库表?

5
我正在使用基于Hibernate的JPA作为我的持久层。我有一个多线程进程,从Soap调用中聚合数据,然后将一行存储到数据库中。该进程通常要插入约700行,并且需要1-3小时左右,其中Soap调用是主要瓶颈。
在整个过程中,我插入的表会锁定并且无法及时返回select语句。下面是SQL服务器的错误信息:
错误消息:超时时间内的锁请求期限已过。
我该如何避免在这个漫长的过程中锁定我的数据库表呢?
3个回答

2
您可能需要更改您的隔离级别。
以下是一些信息: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的装配文件中使用它们来定义特定调用的串行化和传播。如果您有装配示例,我可能能够提供更多提示/信息。


如果您正在使用Spring事务管理器,当您设置事务DAO时,可以为每个事务调用设置隔离级别。 - aperkins
真的吗,你能详细说明一下或者指向一个扩展该主题的文章吗? - James McMahon
请注意,我从Rob Harrop和Jan Machacek的参考书《Pro Spring》中获取了所有Spring信息。虽然这是一本非常枯燥的书,但它是Spring的一个很好的参考资料,具有非常好的索引。这本书最终让我理解了事务处理,尽管这花费了一些时间 :) - aperkins

1
你是用同一个事务插入了所有的700行吗?
你的事务边界在哪里?如果可能的话,可以降低事务边界,即仅对实际插入操作进行事务处理,以便短暂地保持锁定。
如果需要整个过程都是原子性的,可以将其写入临时表中,然后使用批量插入(快速)将其插入到主表中。

我不确定我的事务边界。我在需要事务的DAO方法上有@transactional,但我也在使用DAO的代码入口上有@transactional。如果我删除前者,它会给我一个无事务错误。这是我目前正在调查的问题。请访问http://stackoverflow.com/questions/807457/。 - James McMahon
我的 @Transactional 太过于深入了,一旦我将其移除,进程就可以正常工作而不会锁定数据库。对于 @Transactional 我仍然遇到一些奇怪的问题,但是对于这个进程,我通过依赖于较小的事务来解决了它。这个问题也很有帮助,链接在这里:https://dev59.com/EnNA5IYBdhLWcg3wIqPr。 - James McMahon

0

你是在尝试在一个JPA事务中进行700个SOAP请求吗?不要这样做。 :-)


不,程序所做的是进行SOAP调用以获取结果,然后将其报告到数据库中。交易由Spring处理。 - James McMahon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接