Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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/0/jpa/2.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
Hibernate JPA悲观_写入在同步读取流中的使用_Hibernate_Jpa - Fatal编程技术网

Hibernate JPA悲观_写入在同步读取流中的使用

Hibernate JPA悲观_写入在同步读取流中的使用,hibernate,jpa,Hibernate,Jpa,我正面临这样一种情况:这就是流动 Time T0: Transaction 1 -> Read integer from DB Time T1: Transaction 2 -> Read integer from DB Time T2: Transaction 1 -> Increment, Write and Commit to DB Time T3: Transaction 2 -> Increment, Write and Commit to DB 现在

我正面临这样一种情况:这就是流动

Time T0: Transaction 1 -> Read integer from DB 
Time T1: Transaction 2 -> Read integer from DB 
Time T2: Transaction 1 -> Increment, Write and Commit to DB 
Time T3: Transaction 2 -> Increment, Write and Commit to DB 
现在,此流导致不正确的增量,因为两个事务读取相同的整数值

那么JPA实现中的悲观写锁(Hibernate是我最感兴趣的)是否可以防止这种流呢

该流是否也属于脏读、不可重复读或幻象读的类别
在我看来似乎不是因为

  • 事务2在事务1写入(修改)数据之前读取数据,因此它不是脏读
  • 这里的事务中不会发生多次读取,因此不存在不可重复读取或幻象读取的情况

  • 我假设T1和T2在不同的线程中执行。使用JPA实现这一点会很复杂,但并非不可能

    您必须使用“悲观写锁”读取事务T1和T2中的整数。这样,T2被延迟,直到T1完成,并且增量值将被读取

    类别为“不可重复读取”。在T1中保存增量值后,再次读取T2可能会返回新值。 但是在这种情况下,只剩下很少的数据库管理系统,因为大多数数据库管理系统(如Oracle、MySQL、Postgres)都提供MVCC,因此通常会确保其他事务中的更改延迟到第一个ist完成


    但在其他DBMS中,如果您使用的是隔离级别的“可重复读取”,则记录在读取过程中总是被锁定,以确保它不能更改。因此T2将在T1完成之前传递整数。但请注意,在MVCC-DBMS中,“可重复读取”可以在没有锁的情况下实现,因此隔离级别将不会有帮助。

    我假设T1和T2在不同的线程中执行。使用JPA实现这一点会很复杂,但并非不可能

    您必须使用“悲观写锁”读取事务T1和T2中的整数。这样,T2被延迟,直到T1完成,并且增量值将被读取

    类别为“不可重复读取”。在T1中保存增量值后,再次读取T2可能会返回新值。 但是在这种情况下,只剩下很少的数据库管理系统,因为大多数数据库管理系统(如Oracle、MySQL、Postgres)都提供MVCC,因此通常会确保其他事务中的更改延迟到第一个ist完成


    但在其他DBMS中,如果您使用的是隔离级别的“可重复读取”,则记录在读取过程中总是被锁定,以确保它不能更改。因此T2将在T1完成之前传递整数。但请注意,在MVCC-DBMS中,“可重复读取”可以在没有锁的情况下实现,因此隔离级别将不会有帮助。

    “不会发生多次读取”-关键是,如果事务B决定在T3再次读取整数,它将看到与T1不同的值。可重复读取就是保证。以这种方式考虑可重复读取:一旦事务读取一行,它就不能“幕后”更改。“不会发生多次读取”-问题是,如果事务B决定在T3再次读取整数,它将看到与T1不同的值。可重复读取就是保证。这样考虑可重复读取:一旦事务读取一行,它就不能“在幕后”更改。