我正在嘗試開發一個演示來強化我對REPEATABLE_READ隔離級別的理解。我嘗試過使用hibernate和jdbc進行演示。 JDBC按預期工作,但休眠不。事務隔離級別REPEATABLE_READ使用休眠和jdbc
我的期望是,如果我在一個會話中讀取數據庫行,並嘗試從另一個會話寫入同一行,它應該阻塞,直到第一個會話結束。當我在線程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:德比:隔離;創建=真和hibernate.connection.isolation是。我創建了HibernateExample7_IsolationRR_Thread的兩個對象,並創建了Thread 0獲取車輛並長時間睡眠的場景。同時線程1試圖獲取和更新車輛。它甚至在線程0提交之前成功提交。
由於REPEATABLE_READ隔離級別,T1不應等待提交。如果不是,那麼它是READ_COMMITED隔離級別而不是REPEATABLE_READ隔離級別。
您正在使用什麼版本,如果HSQLDB? – sharakan 2013-02-23 03:56:42
hsqldb 2.2.8版 – 2013-02-23 04:41:51