小编Dun*_*aul的帖子

可序列化事务与SELECT FOR UPDATE

我正在阅读不同的事务隔离级别,并跨越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.findByIdLockModeType.PESSIMISTIC_WRITE(ie SELECT .. FOR UPDATE),然后em.merge(即UPDATE)?
  • 或者使用@Transactional(isolation=SERIALIZABLE),em.findById,然后是em.merge(即UPDATE)?

database jpa

12
推荐指数
1
解决办法
3071
查看次数

标签 统计

database ×1

jpa ×1