4

在大多数页面上,我都读过“DDL 命令在 SQL Server 中具有 AutoCommit”,如果我没记错的话,这句话只是意味着我们不需要 DDL 命令的显式提交命令。

那么为什么...

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

失败,说无效的列名“年龄”

2) BEGIN TRAN
Alter TABLE EMP Add Age INT;
回滚

可以成功回滚。

也许我对 AutoCommit 的概念有误,请举例说明它实际上有影响。

谢谢你的帮助。

4

3 回答 3

6

自动提交交易

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

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

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

这是您的第一个示例处理的内容。

因此,没有人真正处理自动提交事务。


因此,让我们采取如下声明:

Alter TABLE EMP Add Age INT;

如果你在 Autocommit 模式下有一个打开的连接,执行上面的操作,并且它没有错误地完成,那么你会发现这个连接没有打开的事务,并且更改立即对任何其他连接可见。

如果你在 Implicit Transactions 模式下有一个打开的连接,执行上面的操作,并且它没有错误地完成,那么你会发现这个连接有一个打开的事务。任何需要模式锁定的操作都将阻止其他连接EMP,直到您执行COMMITROLLBACK

如果你有一个打开的连接,你已经在其中执行BEGIN TRANSACTION,执行上面的,并且它没有错误地完成 - 那么你将处于与隐式事务相同的情况。但是,在COMMITed 或ROLLBACKed 之后,您的连接将恢复到 Autocommit 模式或 Implicit Transactions 模式(在调用 之前处于活动状态BEGIN TRANSACTION)。

于 2012-07-09T07:39:44.500 回答
1

如果您在第二个示例中明确地有一个 begin tran,那么您必须提交它。(你也可以回滚)

如果您没有像在第一个示例中那样明确指定它,那么它是自动提交的。

autocommit是sql server中的默认模式,如果需要可以关闭

于 2012-07-09T07:43:29.320 回答
0

如果您在代码中添加批处理,它将起作用

Alter TABLE EMP Add Age INT;
go
UPDATE EMP SET Age=20;
于 2012-07-09T11:00:31.200 回答