gpt4 book ai didi

sql - 有没有办法保证 MySQL 中的非阻塞读取?

转载 作者:可可西里 更新时间:2023-11-01 08:01:32 24 4
gpt4 key购买 nike

我已经尝试了明显的“SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED”,但是我的简单存储过程在更新正在进行时在 PRIMARY KEY 上执行 SELECT MAX 时仍然被阻塞(当与某些复杂的更新事务同时运行时我不想修改)——最终会遇到死锁和锁定超时。

当然必须有一种方法来保证非阻塞读取......我认为这就是 READ-UNCOMMITTED 的目的。但我错了……这是 MySQL 的错误吗?有解决方法吗?

我知道 READ-UNCOMMITTED 的所有危险和学术上不合理的属性,但这并不重要,对于我的特定应用程序,这里偶尔出现幻影或缺失行,这真的没什么大不了的,但延迟或错误由读锁引起的问题要严重得多。

数据库中的所有表都是InnoDB。服务器版本是5.0.67。平台是 Linux 32 位。

更新这是问题描述的简化“hello world”版本(我的实际查询太复杂太难看,无法发布):

控制台 1:

mysql> create table t1(a int primary key) engine=innodb;Query OK, 0 rows affected (0.20 sec)mysql> insert into t1 values (1),(2),(3);Query OK, 3 rows affected (0.03 sec)Records: 3  Duplicates: 0  Warnings: 0mysql> start transaction;Query OK, 0 rows affected (0.00 sec)mysql> insert into t1 values (4);Query OK, 1 row affected (0.01 sec)mysql> update t1 set a=5 where a=4;Query OK, 1 row affected (0.00 sec)Rows matched: 1  Changed: 1  Warnings: 0

CONSOLE 2(在单独的窗口中,不要关闭 CONSOLE 1)

mysql> select max(a) from t1;+--------+| max(a) |+--------+|      3 | +--------+1 row in set (0.00 sec)mysql> set @test = (select max(a) from t1);ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

最佳答案

终于明白了:

“这是 MySQL 错误吗?” --> 是的,我会称之为错误。其他人可能称之为限制或“陷阱”。我将其称为 BUG,因为很明显,在没有锁定的情况下检索此数据的理论基础和实际能力已通过主要语法解决方法的存在得到证明。

“有解决方法吗?” --> 有。

重写这个

set @test = (select max(a) from t1);

这样

select max(a) from t1 into @test;

当其他事务未运行时产生相同的结果;并在另一个事务运行时产生预期的结果(值被立即成功检索,而不是死在锁上)。

关于sql - 有没有办法保证 MySQL 中的非阻塞读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1619564/

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