在 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 事务期间使用索引导致无法获取更新锁的主要内容,如果未能解决你的问题,请参考以下文章
MySQL数据库事务各隔离级别加锁情况--read uncommitted篇(转)
数据库事务特征数据库隔离级别,以及各级别数据库加锁情况(含实操)--read uncommitted篇
mysql 5.7.16 然后设置 事务隔离级别为 read uncommitted 不起作用.以下是截图.请大神帮帮我.