透传式单分片事务,即代理事务
前端会话只能绑定一个后端数据库会话
后端会话的响应直接往前端会话写入数据,自动判断响应结束以及事务
问题场景
travelrecord具有全局序列号id字段,而且id是hash型的分片算法
//开始事务
INSERT INTO `db1`.`travelrecord` (`user_id`) VALUES ('2');
//产生id 998,分片算法得出该sql路由到数据源1并开启该后端会话的事务,前端会话绑定该会话直到事务消失
INSERT INTO `db1`.`travelrecord` (`user_id`) VALUES ('2');
//产生id 999,分片算法得出该sql路由到数据源2,但是已经绑定数据源1的会话了,所以插入失败
该事务类型具有极佳的响应性能,极少内存占用,但是要求业务代码在事务中操作数据的时候要准确操作一个分片的数据
一般来说,解决这个问题有五个办法
-
使用能够直接从分片字段值就可以看出是否在操作单分片的分片算法(枚举,日期)能够直接避免这个问题
-
使用单分片下的分库分表/分库/分表
-
同一个事物中的语句,使用动态分片或者注解指定目标总是在同一个分片
-
使用XA事务
-
不开启事务