我正在阅读不同的事务隔离级别,并跨越SERIALIZABLE隔离级别.我也知道Postgres,Oracle和MySQL等数据库支持SELECT .. FOR UPDATE语法.
然而,当我想要锁定我希望执行更新的行(或一系列行)时,我会感到困惑.
在过去使用JPA时,我总是在查询中@Transactional使用a LockModeType.PESSIMISTIC_WRITE.这转换为在SQL中使用READ_COMMITTED隔离级别SELECT .. FOR UPDATE.
但是现在,在阅读之后SERIALIZABLE,我想知道如果我使用@Transactional(isolation=SERIALIZABLE)普通SELECT(例如em.findById来获取分离的实体),然后是UPDATE(实体的合并)会有什么不同.
行为会是一样的吗?
比方说,我有一个银行系统,我希望在两个账户之间转账.转移正在进行中,我要求不要干涉这些帐户.因此,假设我用-100借记一个账户并将其存入另一个账户.确保这些帐户仅可用于执行更新的交易的最佳方法是什么?
假设我正在操作JPA分离的实体,所以在更新之前,我将不得不从数据库中读取它们,例如findById().
@Transactional(isolation=READ_COMMITTED),em.findById与LockModeType.PESSIMISTIC_WRITE(ie SELECT .. FOR UPDATE),然后em.merge(即UPDATE)?@Transactional(isolation=SERIALIZABLE),em.findById,然后是em.merge(即UPDATE)?