【发布时间】:2017-04-14 17:10:57
【问题描述】:
我的 Spring Boot 代码有问题。我正在尝试使用 @Transactional 注释了解隔离级别并给出以下代码:
//BookingService class bookingService2 instance
@Transactional(isolation = Isolation.REPEATABLE_READ)
public String readConstantly() throws InterruptedException {
String name = "";
for(int i=0; i<2; i++) {
name = jdbcTemplate.query("select FIRST_NAME from BOOKINGS where ID=1", (rs, rowNum) -> rs.getString("FIRST_NAME")).get(0);
logger.info("Read name " + name);
Thread.sleep(1000);
}
return name;
}
还有这段代码:
//BookingService class bookingService instance
@Transactional
public void updateOne(){
jdbcTemplate.update("update BOOKINGS set FIRST_NAME = ? where ID = 1", "zz");
}
这样执行:
new Thread(() -> {
try {
bookingService2.readConstantly();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
bookingService.updateOne();
我希望 updateOne 等到 readConstantly 事务结束,但是当我调用它时,这是输出:
2016-11-30 12:29:15.158 INFO 6456 --- [ Thread-3] hello.BookingService : Read name Alice
2016-11-30 12:29:16.158 INFO 6456 --- [ Thread-3] hello.BookingService : Read name zz
我试图理解为什么在这种情况下隔离级别没有做太多工作?
【问题讨论】:
-
你用的是什么数据库?
-
我正在使用嵌套的 H2 数据库
标签: java spring transactions isolation-level