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