在 READ UNCOMMITTED 事务期间使用索引导致无法获取更新锁

Posted

技术标签:

【中文标题】在 READ UNCOMMITTED 事务期间使用索引导致无法获取更新锁【英文标题】:Using Indexes results in Update locks cannot be acquired during a READ UNCOMMITTED transaction 【发布时间】:2021-07-04 14:10:37 【问题描述】:

升级到 mariadb 10.5.11 后,我遇到了一个奇怪的索引问题。

具有两个列的简单表 Type(varchar) 和 Point(point)

Type(Tindex) 上的索引和Point(Pindex) 上的空间索引

现在是一个类似的查询

SELECT X(Point) as x,Y(Point) as y,hotels.Type FROM hotels WHERE (Type in ("acco")) AND MBRContains( GeomFromText( 'LINESTRING(4.922 52.909,5.625 52.483)' ), hotels.Point)
;

结果

查询错误 (1207):在 READ UNCOMMITTED 事务期间无法获取更新锁

同时

SELECT X(Point) as x,Y(Point) as y,hotels.Type FROM hotels USE INDEX (Pindex) WHERE (Type in ("acco")) AND MBRContains( GeomFromText( 'LINESTRING(4.922 52.909,5.625 52.483)' ), hotels.Point)
;

SELECT X(Point) as x,Y(Point) as y,hotels.Type FROM hotels USE INDEX (Tindex) WHERE (Type in ("acco")) AND MBRContains( GeomFromText( 'LINESTRING(4.922 52.909,5.625 52.483)' ), hotels.Point)
;

工作正常。正如 mariadb 10.5.10 所做的那样

|编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 |

| 1 |简单 |酒店 |范围|过滤器 |类型,Pindex | Pindex|类型 | 34|302 |空 | 340 (4%) |使用哪里;使用 rowid 过滤器 |

【问题讨论】:

【参考方案1】:

这个问题现在被跟踪为MDEV-26123(我猜你在那里报告了它)。问题描述说问题是在 MariaDB 10.2.39、10.3.30、10.4.20、10.5.11、10.6.1 中引入的。

我在升级到 MariaDB 10.6.4 后遇到了这个问题。我降级到 10.6.0,无需进行任何数据迁移即可。现在看来问题已经解决了。

【讨论】:

我只是删除旧索引,然后,创建一个不同名称的新索引,神奇地错误消失了......不知道为什么【参考方案2】:

造成这种情况的原因似乎是 code fix 对应于 MDEV-25594。

我在提交消息或讨论中看不到任何表明对 READ UNCOMMITTED 行为的更改是故意的。

没有公开的错误报告,所以我建议您创建一个new bug report。

【讨论】:

MDEV-26123:修复此错误并非易事。我担心 SPATIAL INDEX 的锁定需要完全重新设计。【参考方案3】:

选择@@session.autocommit;

设置@@session.autocommit=0;

选择@@session.autocommit;

#add in my.cnf 自动提交 = 0

使用 mariadb 10.2.40(已解决) https://developpaper.com/transaction-isolation-level-of-mariadb/

【讨论】:

以上是关于在 READ UNCOMMITTED 事务期间使用索引导致无法获取更新锁的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 READ UNCOMMITTED 隔离级别?

MySQL数据库事务各隔离级别加锁情况--read uncommitted篇(转)

数据库事务特征数据库隔离级别,以及各级别数据库加锁情况(含实操)--read uncommitted篇

mysql 5.7.16 然后设置 事务隔离级别为 read uncommitted 不起作用.以下是截图.请大神帮帮我.

009-事务管理

Spring随笔 - 事务隔离级别