gpt4 book ai didi

database - 可序列化事务与 SELECT FOR UPDATE

转载 作者:太空狗 更新时间:2023-10-30 01:44:05 30 4
gpt4 key购买 nike

我在阅读不同的事务隔离级别时,发现了 SERIALIZABLE 隔离级别。我还知道 Postgres、Oracle 和 MySQL 等数据库支持 SELECT .. FOR UPDATE 语法。

然而,当我想锁定要对其执行更新的一行(或一系列行)时,我很困惑应该如何使用这些。

过去使用 JPA 时,我总是在查询中使用 @TransactionalLockModeType.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(即 SELECT .. FOR UPDATE ),然后 em.merge(即 UPDATE)?
  • 或使用 @Transactional(isolation=SERIALIZABLE)em.findById,然后使用 em.merge(即 UPDATE)?

最佳答案

SERIALIZABLE 和使用 SELECT FOR UPDATE 的主要区别在于,使用 SERIALIZABLE 时,所有内容都始终处于锁定状态。与 SELECT FOR UPDATE 一样,您可以选择锁定内容和锁定时间。

因此,如果您只想锁定一些数据,即 BankAccount 而不是其他数据,即 Branch、AccountTypes,那么 SELECT FOR UPDATE 会给您更好的控制,因为 SERIALIZABLE 会阻塞您的整个系统,因为每个事务都是从 ACCOUNT_TYPES 表中选择的.另外,有些交易可能只是想查看余额,所以不需要锁定ACCOUNT表。

看,

http://en.wikibooks.org/wiki/Java_Persistence/Locking

关于database - 可序列化事务与 SELECT FOR UPDATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16957638/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com