最近,我一直在研究数据库事务和一篇引用如下的文章
JPA通过具有@Version注释字段或属性的@Version annotation.When提供行版本控制的自动支持,乐观锁定将自动启用。
我的理解是,数据库隔离级别策略是使用不同的锁来维护的,如
等等。因此,事务性隔离是通过不同的锁定来实现的,我猜是使用悲观锁定。
我的问题是,当一个字段声明为@Version注释时,它是否覆盖了底层的默认隔离级别并进行了乐观锁定?
发布于 2015-12-23 07:52:54
不,它们是不同的东西。默认情况下,隔离级别配置为read-commited,因此在事务提交之前无法读取更改。
如果您决定通过@Version使用乐观锁定,则根本没有更改隔离级别,但假设您希望使用read-commited隔离级别,因为我认为在使用乐观锁定时使用read-uncommited或read-serialized是没有意义的,但您可以。
在创建事务时定义隔离级别,通常指定只读模式、隔离级别、传播模式和事务名称。
乐观锁定由ORM基础结构控制,在持久化时考虑对象的适当编号版本。所以,它们是不同的东西。
希望能帮上忙!
发布于 2015-12-23 09:57:07
不,不能用JPA的乐观锁定覆盖底层数据库的隔离级别。
如果你能做到这一点,那就没什么好处了。
大多数数据库默认采用READ_COMMITED隔离级别。
考虑在READ_COMMITED隔离级别下的以下场景。
Product实体虽然这个场景是微不足道的,但这类事情可能发生在非平凡的场景中。
本可以通过使用带有数据库默认隔离级别的乐观锁定来避免这种意外情况。
希望这能有所帮助。
https://stackoverflow.com/questions/34429744
复制相似问题