TiDB中事务处理疑问,为什么每句SQL语句都重新开启一个事务上下文?

最近开始阅读TiDB源码,session.go 文件内ExecuteStmt函数,会调用PrepareTxnCtx创建事务上下文对象TransactionContext。意味着每条SQL语句都独立一个事务。那我的疑问是对于非autocommit的事务,一个事务内是有多条sql的,这种情况应该是查找是否已有事务上下文对象,在同一个事务内SQL应该获取已经创建的事务上下文对象,而不是再新建。但是源码里没有看到这块的处理逻辑。这块不是很理解,望指教,谢谢

2赞

有人可以帮忙解答下吗?

源码里应该有相应的逻辑的

你好,源码里都是每句sql都新建一个事务上下文对象,没有看到一个事务处理多条sql的逻辑

大家好,学习的问题如何才能得到帮助

该问题应该是个开发相关的问题,欢迎把问题发到开发者社区,和开发者们一起交流吧!

1赞

如果你是非自动提交,那么在你开始一段事务时,就会创建一个事务上下文,此时该事务是会在Session变量中进行保存的,该事务未提交之前,后面再进来的 SQL 其实就是默认在这个事务之中的,直到事务提交。

关于源码的话,其实可以自己用 Begin 和 commit 这种跟着调试一次就知道了。


if s.txn.validOrPending() 就是判断当前 Session 是否存在正在进行的事务。

4赞