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是我最感兴趣的)是否可以防止这种流呢
该流是否也属于脏读、不可重复读或幻象读的类别在我看来似乎不是因为
我假设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不同的值。可重复读取就是保证。这样考虑可重复读取:一旦事务读取一行,它就不能“在幕后”更改。