@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”中有一个默认的隔离级别。
答案 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
}
}