sql - 在带有复制的 typeorm 中,每当我在 EntityManager 事务中时,我是否会点击主实例?
问题描述
我在 AWS RDS 上托管的 Aurora PostgreSQL 数据库遇到了一些竞争条件问题。与正在发生的事情类似的一个例子是:
- 组表有一个列
userEntranceLimits
。 - UserEntrance 表有一个 column
userId
和一个 columngroupId
。 count
特定组的 UserEntrance 的不同用户的 不能超过该组的userEntranceLimits
.- 在创建新 UserEntrance 的事务中,我检查该组的当前 UserEntrance 计数是否 >= 限制。
- 如果不是,我继续创建一个新的 UserEntrance。
- 在极少数情况下,组出现的 UserEntrance 数超过其限制。
我最初认为竞争条件是由于不同步的只读副本。但是,如果我正确理解 typeorm 代码的这一部分,事务将始终在 master 中执行。那正确吗?如果是这种情况,那么我认为竞争条件的实际解决方案是将事务的隔离级别更改为其他东西,例如SERIALIZABLE
. 我想的这些都是真的吗?
解决方案
如果您以typeorm 文档中描述的方式使用它直接调用entityManager.transaction()
或@Transaction()
装饰器,并且如果您使用由事务提供的连接,那么是的,事务正在使用 master。
当我调试 typeorm 源时,在开始事务时,entityManager.queryRunner
是undefined
. 因此,根据EntityManager 实现,将为每个事务创建 queryRunner,但未提供复制模式,因此将使用默认(主)。
因此,您的逻辑比事务配置更可能出现问题。
推荐阅读
- javascript - G2Plot 图表堆栈错误的列
- virtual-machine - Azure 数据科学 VM 传输文件
- ios - 错误 Domain=com.stripe.lib Code=50 “我们在解密您的付款信息时遇到问题。”
- javascript - 数据表只显示一个条目
- javascript - 查询结果后获取文档ID?
- react-native - 如何在 Expo 中创建 react-native apk?
- php - Css 不会在无脂肪框架中呈现
- sql - 如何使用整数数据类型列硬编码整数数据类型联合的空白值
- tensorflow - TensorFlow中不同的多维concat
- java - 如何交换子数组?