Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate-事务:两个帐户之间的一致性_Java_Spring_Hibernate - Fatal编程技术网

Java Hibernate-事务:两个帐户之间的一致性

Java Hibernate-事务:两个帐户之间的一致性,java,spring,hibernate,Java,Spring,Hibernate,如何在Hibernate中保持事务之间的一致性,例如,我有这样的场景- 我有两个交易,T1和T2, 两者同时在同一账户上运行,初始值=500, T1想从A加200,T2想从A减去100。 如果交易是这样发生的- 1. T1 reads value of A as 500, T2 reads value of A as 500. 2. T1 does A = 500 + 200. 3. T2 does A = 500 -100. 4. T2 commits value of A as 400. 5

如何在Hibernate中保持事务之间的一致性,例如,我有这样的场景-

我有两个交易,T1和T2, 两者同时在同一账户上运行,初始值=500, T1想从A加200,T2想从A减去100。 如果交易是这样发生的-

1. T1 reads value of A as 500, T2 reads value of A as 500.
2. T1 does A = 500 + 200.
3. T2 does A = 500 -100.
4. T2 commits value of A as 400.
5. T1 commits Value of A as 700.
A的最终值将为700,这是不正确的。A的正确值应为600

如何解决这个问题

A=帐户,表示元组,即RDBMS表中的一行。在这里,它表示一个由帐号唯一标识的银行帐户。
你可以选择两种策略

第一个是乐观锁定。它允许您检测这种情况,并通过第二次事务失败来解决它们。这意味着

T1将A的值提交为700

结果为javax.persistence.OptimisticLockException。要实现此策略,您应该在表示当前元组版本的实体中创建特殊列,并使用javax.persistence.version对其进行注释。每次提交后,Jpa提供程序将自动增加版本列,并在每次提交时检查其值,如下所示:

1. T1 reads value of A (v1) as 500, T2 reads value of A (v1) as 500 .
2. T1 does A = 500 + 200.
3. T2 does A = 500 -100.
4. T2 commits value of A as 400 - db and entity versions are the same
5. T1 commits Value of A (v1) as 700 - version mismatch: db version is v2 and current version is v1 -> OptimisticLockException
第二种策略是悲观锁定独占锁定:
它允许示例中的第一个事务T1从另一个事务中读取\写入元组,直到它在提交\回滚时释放锁为止。您可以使用javax.persistence.LockModeTypeWRITE作为第二个参数调用javax.persistence.EntityManagerlock来实现这一点

看看锁定策略