2012-07-09 87 views
3

大多数页面我已经读了“DDL命令在SQL Server中有自动提交”,如果我没看错的这一说法只是意味着我们并不需要显式的commit命令DDL命令。DDL命令是SQL服务器中的AutoCommit,是什么意思?

那么为什么...

1)改变表EMP添加年龄INT;
UPDATE EMP SET年龄= 20;

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

2)BEGIN TRAN
ALTER TABLE EMP添加年龄INT;
ROLLBACK

可以成功回滚。

也许我错了自动提交的概念,请用例子来解释它在那里actully有特效。

感谢您的任何帮助。

+1

你的第一个例子表明,批次之前将其完全编译正在执行。它与“自动提交”无关 - 以及你引用哪些资源做出这个声明? – 2012-07-09 07:36:23

+0

@Damien_The_Unbeliever,k然后我的第一个例子与批次有关,对不起,我把它与AutoCommit联系起来。但是你能否让我理解“DDL命令是AutoCommit”,举个例子,它实际上意味着什么? – user369182 2012-07-09 07:42:30

+0

我不知道你从哪里得到“DDL命令是AutoCommit”的短语 - 它对我来说并没有什么意义,因为Autocommit是一种事务模式(与隐式和显式事务相比)。 – 2012-07-09 07:45:07

回答

6

Autocommit Transactions

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

所以,你的第二个例子并不适用。进一步下行:

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

这是你的第一个例子与交易。

所以,没有一个实际处理自动提交事务。


所以,让我们像一个语句:

Alter TABLE EMP Add Age INT; 

如果您在自动提交模式打开连接,执行上面的,它完成时没有错误,那么你会发现,这种连接有没有打开的事务,并且更改立即可见于任何其他连接。

如果您有隐性事务模式打开连接,执行上面,并且它无错误地完成,那么你会发现,这种连接具有打开的事务。在执行EMP需要模式锁定的任何操作之前,其他连接将被阻止,直到执行COMMITROLLBACK

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

+0

thnx,@Damien_The_Unbeliever这个答案清除了我的很多概念。我认为“DDL命令是AutoCommit”的概念是在Oracle中,我通过将它与SQL Server混合而感到困惑。现在可以请告诉我,DDL和DML之间有什么区别,涉及到事务,提交,回滚...... – user369182 2012-07-09 08:08:03

+0

@ user369182 - 没有想到。 [隐式事务](http://msdn.microsoft.com/zh-cn/library/ms188317(v = sql.105).aspx)上的页面具有受模式选择影响的语句的列表。 – 2012-07-09 08:10:44

+0

@Damien_The_Unbeliever,我可以问你是否将你的评论整合到你的答案中?即,“DDL与SQL服务器中的自动提交无关”,这里的问题是默认情况下oracle中的事务是显式的,而DDL会自动提交这些显式事务,所以有人希望看到这是否也是真的在sql server中找到了这个答案,并且乍一看相信它是真的。或者,或者我们将问题修改为“什么是sql server中的自动提交” – 2016-07-20 13:21:20

0

如果你在第二个例子中有一个明确的开始tran,那么你必须提交它。 (你也可以回滚)

如果你没有在第一个例子中指定它的显式,那么它是自动提交的。

自动提交是SQL Server的默认模式,可如果requried

0

被关闭。如果你在你的代码添加批次,将工作

Alter TABLE EMP Add Age INT; 
go 
UPDATE EMP SET Age=20;