EJB事务锁/休眠隔离级别

时间:2018-10-11 06:26:30

标签: mysql hibernate transactions ejb

我有一个Web服务,该服务在数据库中产生大量更新。之后,它将执行其他一些操作(例如演算,调用另一个Web服务等)。最后,它再次与数据库联系。

问题在于,表在整个Web服务生命周期中都被锁定。因此,如果“其他事情”花费的时间更长,那么我暂时无法使用表格。

有一种方法可以只锁定寄存器,而不锁定表?

如何避免这种情况?

我正在使用Hibernate和MYSQL。

2 个答案:

答案 0 :(得分:0)

您使用的是什么事务隔离级别?请参阅documentation,以了解这如何影响锁定以及如何进行更改。

检查您的应用程序。交易应尽可能短。如果需要,请考虑重新设计。您甚至可以考虑使用BASE instead of ACID

答案 1 :(得分:0)

Pro JPA 2书说:

  

现实情况是,实际上很少有应用程序需要悲观锁定,而对于有限的查询子集来说,确实需要悲观锁定。规则是,如果您认为   您需要悲观的锁定,再三考虑。如果你有情况   在同一位置上具有很高的写并发度   对象并且乐观失败的发生率很高,那么您   可能需要悲观的锁定,因为重试的费用可能会变成   如此昂贵,以至于您最好锁定   悲观地。如果您绝对无法重试交易,并且   愿意为此牺牲一些可扩展性,这也   可能会导致您使用悲观锁定。

所以我建议您再考虑一下您的需求。

  

我正在使用PESSIMISTIC_WRITE

休眠模式通过使用“ SELECT…FOR UPDATE”语句获取排他锁(使用悲观锁时)

  

4:Connection.TRANSACTION_REPEATABLE_READ锁定您选择的数据(在事务期间)。因此您不需要使用pessimistic_lock。 悲观锁通常用于repeateabe_read,而事务隔离不是repeatable_read(当已提交读时)

以下链接描述了mysql锁定机制

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html#isolevel_repeatable-read

  

有一种方法可以只锁定寄存器,而不锁定表?

应该锁定所选行而不是表(检查您的选择)