我有点不清楚@Transactional注解在业务/服务层的用法。
我的问题是,当在业务层中与ISOLATION_SERIALIZABLE 一起使用时,@Transactional
注释是否保证不允许对特定方法进行并发访问?
@Transactional(isolation = Isolation.SERIALIZABLE)
public void businessMethod() {
// calls subBusinessMethod
subBusinessMethod();
---------------
---------------
---------------
}
假设 subBusinessMethod
调用 DAO 层来执行一些数据库事务。调用 subBusinessMethod
后的代码执行(可能有更多的数据库调用)取决于 subBusinessMethod
中发生的数据库事务的结果。
我需要确保对 businessMethod
的后续调用不应调用 dao 层来读取/写入数据库,而不知道先前调用的 db 表发生了什么。业务逻辑中添加了必需的验证。
首先,我的方法是否有效?如果是这样,我是否以正确的方式使用它。 ?
最佳答案
没有。 @Transactional
属性直接向下映射到数据库级别。该方法可以并且将被并发访问(只有 synchronized
或其他锁定可以防止这种情况)。
另一方面,底层数据库事务将以可序列化隔离的方式执行,即事务的最终结果必须就像每个事务一个接一个地运行一样(即使它们实际上并不是一个接一个地运行)。
根据您的要求,这似乎是一种可行的方法。但它可能不是唯一的,甚至不是最好的。
关于java - @Transactional注解是否避免并发访问业务层方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48297428/