【问题标题】:Using Indexes results in Update locks cannot be acquired during a READ UNCOMMITTED transaction在 READ UNCOMMITTED 事务期间使用索引导致无法获取更新锁
【发布时间】: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 过滤器 |

【问题讨论】:

    标签: mariadb mariadb-10.5


    【解决方案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/

    【讨论】:

      猜你喜欢
      • 2014-11-22
      • 2013-08-02
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 2017-02-07
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      相关资源
      最近更新 更多