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