我有两张桌子:
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的补丁。