DDL命令是SQL Server中的AutoCommit,它是什么意思?

use*_*182 3 sql-server

在大多数页面中,我已经读过"DDL命令在SQL Server中有自动提交",如果我没有错,这个语句只是意味着我们不需要显式提交命令来执行DDL命令.

那么为什么...

1)更改表EMP添加年龄INT;
更新EMP SET年龄= 20;

失败,说无效的列名称'年龄'

2)BEGIN TRAN
Alter TABLE EMP Add Age INT;
ROLLBACK

可以成功回滚.

也许我对AutoCommit的概念有误,请用实例解释它,它实际上有效果.

谢谢你的帮助.

Dam*_*ver 6

自动提交交易:

与数据库引擎实例的连接以自动提交模式运行,直到BEGIN TRANSACTION语句开始...

所以,你的第二个例子不适用.再向下:

在自动提交模式下,有时看起来好像数据库引擎的实例已回滚整个批处理而不是只回滚一个SQL语句.如果遇到的错误是编译错误,而不是运行时错误,则会发生这种情况.编译错误会阻止数据库引擎构建执行计划,因此批处理中不会执行任何操作.

这是你的第一个例子处理的内容.

因此,实际上没有人处理Autocommit交易.


所以,让我们采取如下声明:

Alter TABLE EMP Add Age INT;
Run Code Online (Sandbox Code Playgroud)

如果您在自动提交模式下有一个打开的连接,执行上面的操作,并且它完成没有错误,那么您将发现此连接没有打开的事务,并且更改对任何其他连接立即可见.

如果你在隐式事务模式下有一个打开的连接,执行上面的命令,它完成没有错误,那么你会发现这个连接有一个打开的事务.其他连接将在需要模式锁定的任何操作上被阻止EMP,直到您执行COMMIT或者ROLLBACK.

如果你有一个打开的连接,你已经执行了BEGIN TRANSACTION,执行上面的操作,它完成没有错误 - 那么你将处于与隐式交易相同的情况.但是,COMMIT编辑或ROLLBACK编辑后,您的连接将恢复为自动提交模式或隐式事务模式(在调用之前处于活动状态BEGIN TRANSACTION).