我正在尝试开发一个演示来强化我对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