【问题标题】:Isolation level repeatable read spring boot隔离级别可重复读取弹簧靴
【发布时间】: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


【解决方案1】:

this,好像H2不支持可重复读。您可能需要改用“Serializable”。

【讨论】:

  • 嗨,它仍然不起作用。更好的是,我只是添加了 SET LOCK_MODE 1;在sql schema脚本中,甚至通过((org.apache.tomcat.jdbc.pool.DataSource) template.getDataSource()).setDefaultTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE)获取数据源并设置隔离级别;它仍然无法按预期工作。可能是因为使用 JDBCTemplate 而不是普通的 jdbc?我什至检查了 txmanager 和 jdbctemplate 对数据源的引用,它们是相同的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 2021-01-27
  • 2018-04-09
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
相关资源
最近更新 更多