我對原子操作的理解是操作的步驟不應該與其他任何操作的步驟交錯 - 它應該作爲一個單元來執行。究竟是什麼意思春天交易是原子?
我有一個創建數據庫記錄的方法,首先檢查具有相同值的記錄是否已滿足某些其他參數,如果不存在,則創建該記錄。
在fakecode:
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()仍然包含在同一個對象中交易。
我的期望是什麼事務性原子性應該強制執行錯誤?我是否需要使用同步塊來執行此操作?
不幸的是,我不能在DB上使用唯一的約束,因爲它並不是絕對唯一的 - 正如前面提到的那樣還有其他參數,並且它們表示可以多次使用相同的值。 –