![QQ图片20210514152820.png](https://static.studygolang.com/210514/78329e0888905535b9c6f2a1398abe24.png)![QQ截图20210514153014.png](https://static.studygolang.com/210514/cdee7587dcc28e01219d3b8581fb3d45.png)![QQ截图20210514152941.png](https://static.studygolang.com/210514/3a8084373c4a623d76d43eb272b6e237.png)
如图所示,代码执行后,事务回滚并没报错,但是数据还是被insert进数据库了。求解
你应该使用conn来执行Exec,而不是对应的database,database执行Exec的时候,是从连接池里随机取一个来执行的,只有Begin函数返回的conn是固定的那个连接。
你这代码就是在A连接Begin,B连接执行语句,然后A连接执行rollback,当然回滚不成功。
#1
更多评论
### 修改 直接使用
conn.Exec(sql)
### 连接数据库,可以有很多连接;
这些连接一般是tcp长连接、或者短连接、这需要看具体的driver库实现了
database.Begin()获取的conn 和 database.Exec()
它们所使用的数据库连接不一定是一个,数据库上也就不在一个process线程里,
也就是插入语句和回滚在两个连接上传递给mysql的。mysql当并发了,rollback没有回滚任何执行过的sql-报错;
#2