代码之家  ›  专栏  ›  技术社区  ›  Roman Puchkovskiy

MariaDB:隐式提交发生在分区表上

  •  0
  • Roman Puchkovskiy  · 技术社区  · 8 年前

    我有两张桌子: main 和 secondary .两者都是InnoDB表。

    第一个分区是按范围划分的,目前只有一个分区。

    | main | CREATE TABLE `main` (
      `main_id` int(10) NOT NULL AUTO_INCREMENT,
      `type` varchar(64) DEFAULT NULL,
      `username` varchar(64) DEFAULT NULL,
      `file_name` varchar(256) DEFAULT NULL,
      `the_date` datetime DEFAULT NULL,
      `partition_key` int(6) unsigned DEFAULT NULL,
      `content` mediumblob,
      `completed_date` datetime DEFAULT NULL,
      `info` varchar(255) DEFAULT NULL,
      KEY `pk_main` (`main_id`),
      KEY `idx_main_types` (`type`)
    ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8
    /*!50100 PARTITION BY RANGE (partition_key)
    (PARTITION main_201807 VALUES LESS THAN (201808) ENGINE = InnoDB) */ |
    

    次表未分区。

    | secondary | CREATE TABLE `secondary` (
      `sec_id` int(10) unsigned NOT NULL,
      `username` varchar(64) NOT NULL,
      `file_name_hash_md5` varchar(32) NOT NULL,
      `file_content_hash_md5` varchar(32) DEFAULT NULL,
      PRIMARY KEY (`sec_id`),
      UNIQUE KEY `unq_secondary_file_name` (`file_name_hash_md5`,`username`),
      UNIQUE KEY `unq_secondary_file_content` (`file_content_hash_md5`,`username`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    

    我运行的代码在事务内部工作。事务隔离非常重要 READ_COMMITTED ,auto_commit为false。代码会将一条记录插入到 主要的 ,然后一张唱片 次要的 ,然后在一切正常的情况下提交。

    但在我的场景中,第二个 INSERT 由于唯一约束冲突而失败。在我的代码中,我在事务提交/回滚之前捕获相应的异常,并将该事务标记为回滚。我可以在调试器中看到 Connection#rollback() 实际上有人打电话。我还在MariaDB中启用了查询日志,在这个连接中我只看到3个查询(在设置之后):两个 插入 s和a ROLLBACK .

    但是在回滚之后,插入到 主要的 桌子仍在那里,不会向后滚动。此外,如果我在代码中捕捉到一个断点 COMMIT 或 回降 发布(但在两个 插入 一个成功,一个失败),我看得出来 主要的 来自不同mysql客户端会话的记录,即使它还不应该提交。

    我知道有些行动(比如发布 TRUNCATE 在同一个会话中)可能会导致隐式提交,但我只有2个 插入 s和一 回降 在日志中。

    为什么会这样?是否有任何工具可以跟踪此类隐式提交(或提交数据的原因)?

    MariaDB版本是 10.0.34-MariaDB-0ubuntu0.16.04.1

    使现代化

    在版本为10.0.30-MariaDB-1~jessie的MariaDB中,它工作正常,因此问题似乎要么是特定版本(10.0.34)的问题,要么是特定于Ubuntu的补丁。

    0 回复  |  直到 8 年前