mysql/aurora 没有立即看到已提交事务的结果

标签 mysql concurrency transactions amazon-aurora

在针对 AWS aurora-mysql 数据库运行的系统中,运行以下(显然极其简化)代码。它是一个高度并发的系统(如果重要的话,用java编写),具有多个线程,多个到数据库的连接。我们遇到的问题是当两个线程几乎同时尝试将“abc”插入表中时。

正如预期的那样,如果线程 1 和线程 2 同时启动,线程 2 将在开始时陷入等待“select...for update”语句的状态。一旦线程 1 提交其事务,锁就会被释放,线程 2 继续执行。

问题在于,thread2 从 tbl_foo 中选择的下一行没有返回结果,导致它执行了错误的代码块,尽管它刚刚被插入。事实上,thread2 稍后的插入将由于违反唯一约束而失败,因此它确实“知道”该行在那里。这是 mysql 和/或 aurora 读取缓存的已知问题吗?是否有一些配置设置会改变它?

<start transaction>

SELECT * FROM tbl_user WHERE userID = 123 FOR UPDATE;

SELECT * FROM tbl_foo WHERE fk_user = 123 AND unique_column = 'abc';

if (found row in tbl_foo)
    do stuff
else
    do different stuff including inserting (123, 'abc') into tbl_foo

<commit transaction>

最佳答案

应该与隔离级别相关

请检查隔离级别。

关于mysql/aurora 没有立即看到已提交事务的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58098918/

相关文章:

nhibernate - 使用Spring和Hibernate在两个数据库实例中使用声明式事务管理

mysql - 插入从锁定行中获取的值的问题

mysql - 使用 where 子句合并 2 个 sql 语句

php - MySQLi 事务成功,但带有 bind_param 警告

mysql - 选择MySQL中多个字段的值出现次数

php - 找出究竟删除了哪些项目?

java - 是否可以使用并行流来执行这些循环?

go - 在一定时间内从 channel 阅读的惯用方式

java - 如何中断 CompletableFuture 的底层执行

Android-重复 fragment 交易和手机资源(复杂)