我试图了解事务链接和自动提交概念之间的关系。自动提交通常在客户端编程接口中公开。例如在 JDBC 中使用Connection#setAutoCommit方法。
即我想知道是否:
- 这些概念只是彼此的别名(以及对应关系是什么)
或者
- 这些概念是正交的,所有 4 种组合都有意义并产生不同的结果(以及这些结果是什么)
有许多资源表明案例是 1。相同的资源似乎表明unchained
对应于autocommit on
. 例如
这篇文章说:
设置链式关闭(Sybase 中的默认设置,= 设置自动提交)
这个更广泛的帖子同样说:
一些数据库编程接口具有自动提交模式,也称为非链模式。在这种模式下,每条语句都是一个事务,执行后提交。如果您希望在应用程序中使用事务,则需要使用手动提交模式或链式模式。
到目前为止,这是我自己的理解。例如,每当我尝试执行(使用 JDBC)存储过程时,都会遇到以下消息:
java.sql.SQLException:存储过程 'whatever' 只能在非链式事务模式下运行。
…然后在我的代码中设置:
conn.setAutoCommit(true);
…修复了似乎确认确实unchained与autocommit相同的问题。
但是查看Sybase ASE 文档,其中一个内容如下:
默认模式称为非链接模式或 Transact-SQL 模式,需要显式开始事务语句与提交事务或回滚事务语句配对才能完成事务。
这似乎与自动提交完全相反——除非上述文本被理解为具有以下含义:
默认模式,称为 unchained 模式或 Transact-SQL 模式,需要显式开始事务语句与提交事务或回滚事务语句配对,以在一个事务中放置多个语句时完成事务。
最后,我看到这篇文章表明链接和自动提交大多是正交的。
AutoCommit true 与 chained off 相同
AutoCommit false 与 chained on 相同
在链式模式下,您的第一条语句将启动一个隐式事务,该事务将保持活动状态,直到您手动提交或回滚。
尽管手册说默认模式是未链接的,但客户端库并非如此。除非您覆盖它,否则 JDBC 和 Python 驱动程序使用默认模式链式。