REPEATABLE_READ 分離レベルの理解を深めるために、デモを開発しようとしています。hibernate と jdbc を使用してデモを試しました。JDBC は期待どおりに動作しますが、休止状態はそうではありません。
私の予想では、あるセッション内でデータベース行を読み取り、別のセッションから同じ行を書き込もうとすると、最初のセッションが終了するまでブロックされるはずです。
Hibernate :- スレッド 0 でオブジェクト (行) を取得してスリープし、スレッド 1 内で同じオブジェクト (行) を更新しようとすると、スレッド 1 はスレッド 0 がコミットされるまで待機する必要があります。
class HibernateExample7_IsolationRR_Read_Write_Thread implements Runnable {
private static final Logger logger = LoggerFactory.getLogger(HibernateExample7_IsolationRR_Read_Write_Thread.class);
SessionFactory sessionFactory;
int sleep;
int newnumberplate;
public HibernateExample7_IsolationRR_Read_Write_Thread(SessionFactory sessionFactory, int sleep, int newnumberplate) {
this.sessionFactory = sessionFactory;
this.sleep = sleep;
this.newnumberplate = newnumberplate;
}
public void run() {
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
logger.info("TRYING TO GET VEHICLE 1");
Vehicle vid1 = (Vehicle) session.get(Vehicle.class, Integer.valueOf(1));
logger.info("GOT VEHICLE 1");
vid1.setNumberplate(this.newnumberplate);
logger.info("SET NUMBERPLATE FOR 1");
try {
Thread.sleep(sleep);
} catch (InterruptedException e) {
e.printStackTrace();
}
tx.commit();
session.close();
logger.info("COMMITED");
}
}
hibernate.connection.url はjdbc:derby:isolation;create=trueであり、hibernate.connection.isolation は2です。HibernateExample7_IsolationRR_Thread の 2 つのオブジェクトを作成し、Thread 0 が車両を取得して長時間スリープするシナリオを作成します。一方、スレッド 1 は Vehicle の取得と更新を試みます。スレッド 0 がコミットする前でも、正常にコミットされます。
REPEATABLE_READ 分離レベルにより、T1 はコミットを待機するべきではありません。そうでない場合は、REPEATABLE_READ 分離レベルではなく、READ_COMMITED 分離レベルです。