事务隔离级别如何使用多个@Transactional 改变整个事务

时间:2021-07-22 07:41:41

标签: java spring hibernate transactions spring-transactions

@Transactional
public void a() {
  b();
  c();
}

@Transactonal(isolation = Isolation.SERIALIZABLE)
public void b() {
  // some code with update in db
}

public void c() {
  // some code with selects and updates in db
}

在方法“c”中将使用什么隔离级别? 据我了解,这一切都将是一笔交易。在方法“b”中,我们只是加入当前事务并更改其隔离级别。但是方法b执行后会改回默认值吗?

我问它是因为在这种大负载的情况下,我们在方法“c”中得到了“PSQLException:错误:由于并发更新而无法序列化访问”,尽管我想在方法“c”中有一个默认的隔离级别。

1 个答案:

答案 0 :(得分:0)

@Transactional
public void a() {
  b();
  c();
}

@Transactonal(isolation = Isolation.SERIALIZABLE)
public void b() {
  // some code with update in db
}

public void c() {
  // some code with selects and updates in db
}

使用 @Transactional 从同一个类调用另一个方法将没有效果,因为代理不能从同一个类调用。这就是幕后代理的方式,工作不允许这样的事情。

但是,如果您从另一个 spring bean 调用另一个方法,则该方法具有 @Transactional 这将被尊重。

@Service
public SpringClass {

    @Transactional
    public void a() {
      anotherSpringClass.b();
      anotherSpringClass.c();
    }

}

您可以在此处定义要使用另一个隔离级别打开嵌套事务。

@Service
public class AnotherSpringClass {

@Transactional(propagation = Propagation.NESTED, isolation = Isolation.SERIALIZABLE)
public void b() {
  // some code with update in db
}

}