2

我们有一个在 Glassfish 3.0.1 上运行的 Java EE 应用程序,它使用 EJB、JPA 和 Hibernate 作为实现,并使用 MS SQL Server 2008 R2 作为数据库引擎,使用 JTDS 作为 JDBC 驱动程序。我们通过在每个实体上指定 @version 字段来选择乐观锁定策略。数据库访问可以是并发的,并且在 JTA 事务期间可能会请求大量数据库读取。

我们试图通过将它们分解为一个小的工作单元来使我们的交易尽可能快。

不幸的是,我们处于一种情况,即我们获得了永无止境的数据库锁。我们可以从 MS SQL Server 活动监视器中看到,一个事务锁定了其他事务,并且那个特定的事务在我们杀死它之前永远不会停止。如果我们查看该语句,它是对历史表的​​插入,它阻塞了其他事务,这些事务只是在与历史表无关的另一个表上选择。

第一个问题,既然我们采用了乐观锁定策略,为什么 SQL Server 会锁定表?我们如何防止这种行为?

4

0 回答 0