当前位置: 首页 > 工具软件 > go-mc > 使用案例 >

go mysql driver事务_让 go-sql-driver/mysql 兼容 cobar 的事务

谢豪
2023-12-01

背景介绍

由于历史原因,我们部门的 MySQL 中间件既有 MySTART TRA

和 BEGIN

显式地开启事务。

单库事务完全支持,

执行阶段:把前端连接上当前事务所使用到的后端连接绑定下来,并执行SQL语句

提交阶段:将commit命令分发到这些绑定的后端连接中。

在整个事务过程中,执行阶段出错,可以回滚。提交阶段出错不可以回滚。可以说只要是commit之前,执行出现不一致,cobar会自动回滚。

如何兼容

可以通过 SET AUTOCOMMIT=0

来开启事务, 但是事务结束后,马上又开启了新的事务,如果后面的语句不SET AUTOCOMMIT=1

,使改动立即生效。

我们用的

connection.go

-err := mc.exec("START TRANSACTION")

+err := mc.exec("SET AUTOCOMMIT=0")

transaction.go

err = tx.mc.exec("COMMIT")

+err = tx.mc.exec("SET AUTOCOMMIT=1")

err = tx.mc.exec("ROLLBACK")

+err = tx.mc.exec("SET AUTOCOMMIT=1")

详细改动 见此

改完是能用的。但是后来这个项目迁移到我们的

_ "

问题是,我还得用改过的那份代码呢,并且二者是不能同时引入的。这就蛋疼了。

为何不能同时引入 github.com/go-sql-driver/mysql

和 github.com/yiyulantian/mysql

(就是上面提到改动的那份fork) 呢? 其实它俩对于 da

go-sql-driver/mysql

是这样注册进去的

func init() {

sql.Register("mysql", &MySQLDriver{})

}

而 sql.Register

做了名称的唯一性检查:

// Register makes a database driver available by the prov

对于这种 panic, 总不能为了绕过去而做一次 recover 吧。

于是我决定曲线救国, 改个名字。

func init() {

- sql.Register("mysql", &MySQLDriver{})

+ sql.Register("mysql_cobar", &MySQLDriver{})

}

在使用上,创建一个 DB 对象就是这样啦:

希望 DBA 快点废掉 cobar !

Cobar 和 Mycat 对 BEGIN 和 START TrANSACTION 的代码实现

先看下 Cobar(不贴代码了,自己点链接去看)

Begin

再看下 Mycat

Begin

Start

代码链接都是截止至 2017.01.19 最新的commit。

参考资料

Cobar

Cobar的使用与心得(持续更新)

cobar中是怎么支持事务的

MYSQL–事务处理

本文地址

 类似资料: