【发布时间】:2013-06-02 04:46:02
【问题描述】:
我正在阅读不同的事务隔离级别,并遇到了SERIALIZABLE 隔离级别。我也知道 Postgres、Oracle 和 MySQL 等数据库支持SELECT .. FOR UPDATE 语法。
然而,当我想锁定我希望对其执行更新的一行(或一系列行)时,我很困惑如何使用这些。
过去使用 JPA 时,我总是在查询中使用 @Transactional 加上 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(即SELECT .. FOR UPDATE),然后使用em.merge(即UPDATE)?李> - 或者使用
@Transactional(isolation=SERIALIZABLE),em.findById,然后em.merge(即UPDATE)?
【问题讨论】: