我对原子操作的理解是,操作的步骤不可能与任何其他操作的步骤交错 - 它应该作为一个单元执行。
我有一个创建数据库记录的方法,它首先检查是否存在具有相同值的记录,它也满足某些其他参数,如果存在,则不会创建记录。
在假代码中:
public class FooDao implements IFooDao {
@Transactional
public void createFoo(String fooValue) {
if (!fooExists(fooValue)) {
// DB call to create foo
}
}
@Transactional
public boolean fooExists(String fooValue) {
// DB call to check if foo exists
}
}
但是我已经看到可以创建两个具有相同值的记录,这表明这些操作以某种方式交错。我知道使用 Spring 的事务代理,对象内方法的自调用不会使用事务逻辑,但如果从对象外部调用 createFoo(),那么我希望 fooExists() 仍然包含在同一个对象中交易。
我对应该强制执行哪些事务原子性的期望是错误的吗?我是否需要使用同步块来执行此操作?