DDL 语句隐式提交的(事实上的)标准是什么?

What is the (de-facto) standard for implicit commit on DDL statements?

Oracle 对 DDL 语句进行隐式提交。因此,例如,您不必提交 ALTER 语句。

Microsoft SQL 要求提交 DDL 语句。

SQL-92 太旧了,只有关于交易的基本信息和最新的 SQL 标准文件要花钱,我拒绝为应该免费的东西付费(恕我直言)。

所以我希望有人知道标准说的是什么,如果标准没有阐明这一点,也许有一个事实上的标准或 "design recommendation" 供 DBMS 开发人员使用。

非常感谢。

编辑:

澄清一下:我想知道的是,如果数据库应该对 DDL 语句进行隐式提交(根据标准或某种事实上的标准/建议)。我 不想 想知道实际的 DBMS 在实践中做了什么,因为我已经知道了(并且在 SO 上已经回答了好几次)。

感谢@GolezTrol 提供的 link,我得以阅读 SQL:2003 标准的草案。

4.33.4 SQL-statements and transaction states 它说,所有 SQL Schema statements 都是 transaction initiating。

4.33.5 SQL-statement atomicity and statement execution contexts中说,没有原子SQL语句(和SQL模式语句被认为是原子的)可能会终止 SQL 事务。

最后,在 4.35.6 Effects of statements in an SQL-Transaction 中说:

The execution of an SQL-statement within an SQL-transaction has no effect on SQL-data or schemas other than the effect stated in the General Rules for that SQL-statement, in the General Rules for Subclause 11.8, "referential constraint definition", in the General Rules for Subclause 11.39, "trigger definition", and in the General Rules for Subclause 11.50, "SQL-invoked routine"

因此,标准似乎不允许在 DDL 语句中隐式提交,因为它会终止事务并在原子语句中打开一个新事务。这是有争议的,如果关闭事务被认为是 SQL 模式或数据 (4.35.6) 上的 "effect" - 也许这个注释与决定是否允许隐式提交无关。

并且在 4.35.1 SQL-transactions 的一般描述中说:

It is implementation-defined whether or not the execution of an SQL-data statement is permitted to occur within the same SQL-transaction as the execution of an SQL-schema statement. If it does occur, then the effect on any open cursor or deferred constraint is implementation-defined. There may be additional implementation defined restrictions, requirements, and conditions. If any such restrictions, requirements, or conditions are violated, then an implementation-defined exception condition or a completion condition warning with an implementation-defined subclass code is raised.

那么,如果实现 允许在一个事务中使用数据和模式语句,会发生什么?然后,您被迫在 group 模式语句之前和之后使用 COMMIT。因此,这无法解释为什么 each 模式语句应该被 COMMIT 隐式包围。

一般来说,标准中的页面读起来就像它们总是认为存在已处理的 SQL 模式语句是理所当然的。

所以我的结论是,标准方法是 NOT 在 DDL 语句中使用隐式 COMMIT。

如果您不介意并且没有人反对/抗议我对标准的解释,我将在接下来的几天内接受我所发现的内容。