@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: ERROR: want’t serialize access big update‘,尽管我希望在方法'c’中有一个默认的隔离级别。
发布于 2021-07-22 16:11:26
@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
}
}https://stackoverflow.com/questions/68480954
复制相似问题