![]() |
1
51
不管您是否在使用Spring进行事务管理,这都不重要,而且在并发管理方面也不相关,这实际上是由Hibernate处理的。Hibernate可以使用两种策略来处理并发更新:乐观锁定和悲观锁定。 乐观的使用乐观锁定时,将特殊属性(数字、时间戳)映射为 版本 (所以你实际上有一个专栏)。当检索实体和 包括 在更新和 递增的 通过Hibernate。 为了说明这是如何工作的,让我们假设您按id=1和当前版本=1加载一个个人实体。保存之后,Hibernate将执行如下操作:
所以,现在,假设有两个并发事务正在运行,每个事务都加载 相同的 实体(相同版本号)并更改名称。 假设首先提交事务1,执行以下查询:
它成功并且版本增加。 然后提交事务2,执行以下查询:
这个不会更新任何内容,因为WHERE子句与任何记录都不匹配。这就是您将得到一个乐观并发异常的地方。 当您不维护连接、并发访问不频繁且扩展性非常好时,此策略是合适的。当然,只要映射一个版本属性,Hibernate就会为您透明地处理所有事情。 悲观的
当使用悲观锁定时,Hibernate会锁定一个记录以供您专用,直到您完成它为止(通常使用
工具书类 |
![]() |
2
1
有一些JPA实现,比如ObjectDB,其中乐观锁是默认激活的,用户不需要在数据库表中维护版本变量,因为它是由ObjectDB内部处理的。乐观锁定在更新不频繁和锁定具有隐含成本的情况下是很好的,比如在电子商务中,锁定意味着业务损失。悲观锁是一种理想的锁,在这种情况下,并发性不需要太多需求,并且事务很快完成以释放资源。 |
![]() |
3
0
有一些 documentation about sessions and transactions on the Hibernate community wiki . 它最终由底层RDBMS事务处理,但您需要注意加载或保存的对象的生命周期。 |
![]() |
4
-2
|
![]() |
maddy · 如何根据oracle SQL中的某一列值进行排名 2 年前 |
![]() |
kiric8494 · 显示以元音开头和结尾的城市名称 3 年前 |
![]() |
Franz Biberkopf · Oracle:组合子查询和聚合函数 3 年前 |
![]() |
BitLauncher · 甲骨文-如何模拟位列和布尔和/或? 3 年前 |
![]() |
Arifullah · 如何从oracle中的列中删除特定的初始字符? 3 年前 |
![]() |
Anar · Oracle SQL用户定义函数 3 年前 |
![]() |
user1312312 · 如何为一组表编写通用触发器? 3 年前 |