繁体   English   中英

JPA乐观锁定与同步Java方法

[英]JPA optimistic locking vs synchronized Java method

使用JPA乐观锁定,我们可以通过@Version字段控制数据库表是否已被另一个事务同时更新,从而可以将可靠的数据存储在数据库中。

如果Java应用程序只有一个CRUD服务负责数据库中的特定实体,我们可以同步其方法并管理信息在数据库中存储的顺序。

所以我的问题是,这些方案之间有什么区别? 绩效或最佳实践是否存在优势?

方法同步的缺点:

  1. 您将序列化属于该实体类的所有实体实例的更新。 两个并发线程将无法更新两个不同的实例。
  2. 它在群集中不起作用。
  3. 维护比较困难。 如果对实体的操作变得更加复杂,因此有可能在多个服务中更新实体,或者您需要在同一事务中更新不同此类实体类的实例,则必须将它们全部同步。
  4. 第三点增加了僵局的机会。
  5. 您将必须确保执行包含必需的同步锁的整个事务,否则,如果在提交事务之前释放了该锁,则并发事务可能会获得该锁并继续更改相同的数据。
  6. 根据使用情况,即使线程/事务不是并发的,如果没有版本控制,您也不知道数据在此期间是否发生了变化(例如,您获取数据,根据数据在客户端上进行某些修改,然后再进行其他修改)更改该数据,然后保存您的修改)。

将同步视为悲观锁定:您必须在开始工作之前保留锁定,而不是仅在完成工作后检查是否违反了锁定(提交期间的乐观锁定)。 两者的用途截然不同:

  • 乐观锁仅用于确保没有不一致的数据库状态(防止在不知不觉中覆盖数据),但不能保证您不会因更改db行失败而无法获得OptimisticLockException。 因此,乐观锁具有更好的性能。
  • 悲观锁确保您将永远不会写一行,并且您将知道它的最新值(只要在使用此实体的任何地方进行同步)

通常:不要使用同步来锁定实体,JPA中提供了悲观锁定支持,可以锁定实际的数据库行: http : //docs.oracle.com/javaee/6/tutorial/doc/gkjiu.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM