Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server DDL命令在SQL server中是自动提交的,这意味着什么?_Sql Server - Fatal编程技术网

Sql server DDL命令在SQL server中是自动提交的,这意味着什么?

Sql server DDL命令在SQL server中是自动提交的,这意味着什么?,sql-server,Sql Server,在我读过的大多数页面中,“DDL命令在SQL Server中具有自动提交功能”,如果我没有错的话,这个语句仅仅意味着我们不需要显式提交DDL命令 那为什么 1) 改变表EMP添加年龄INT 更新EMP集合年龄=20 失败,显示无效列名“Age” 2) 开始传输 改变表EMP添加年龄INT 回滚 可以成功回滚 也许我对自动提交的概念有误,请举例说明它的实际效果 谢谢你的帮助。: 到数据库引擎实例的连接在自动提交模式下运行,直到begintransaction语句启动 所以,你的第二个例子不适用。再

在我读过的大多数页面中,“DDL命令在SQL Server中具有自动提交功能”,如果我没有错的话,这个语句仅仅意味着我们不需要显式提交DDL命令

那为什么

1) 改变表EMP添加年龄INT
更新EMP集合年龄=20

失败,显示无效列名“Age”

2) 开始传输
改变表EMP添加年龄INT
回滚

可以成功回滚

也许我对自动提交的概念有误,请举例说明它的实际效果

谢谢你的帮助。

到数据库引擎实例的连接在自动提交模式下运行,直到
begintransaction
语句启动

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

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

这就是您的第一个示例所涉及的内容

因此,两者都没有处理自动提交事务


那么,让我们做一个如下陈述:

Alter TABLE EMP Add Age INT;
如果您在自动提交模式下有一个打开的连接,执行上述操作,并且该连接在没有错误的情况下完成,那么您将发现该连接没有打开的事务,并且任何其他连接都可以立即看到更改

如果您在隐式事务模式下有一个打开的连接,执行上面的操作,并且完成时没有错误,那么您将发现此连接有一个打开的事务。在执行
COMMIT
ROLLBACK
之前,任何需要对
EMP
进行架构锁定的操作都会阻止其他连接


如果您有一个打开的连接,在该连接中您执行了
开始事务
,执行上述操作,并且完成时没有出现错误-那么您将处于与隐式事务相同的情况。但是,如果启用了
COMMIT
ed或
ROLLBACK
ed,您的连接将恢复为自动提交模式或隐式事务模式(在调用
BEGIN TRANSACTION
之前处于活动状态)。

如果您有一个类似于第二个示例中的BEGIN-tran,则必须进行提交。(您也可以回滚)

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


自动提交是sql server中的默认模式,如果需要,可以关闭自动提交。如果在代码中添加批处理,则自动提交将正常工作

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

您的第一个示例显示,批处理在执行之前是完全编译的。它与“自动提交”无关——你引用了哪些资源来做出这一陈述?@Damien_The_unsiver,k然后我的第一个例子与批次相关,很抱歉我将其与自动提交相关。但是你能通过一些例子让我理解“DDL命令是自动提交的”吗?它实际上意味着什么?我不知道“DDL命令是自动提交的”这个短语是从哪里来的-它对我来说没有太多意义,因为自动提交是一种事务模式(与隐式和显式事务相比)。thnx,@Damien_不信者这个答案澄清了我的很多概念。我认为“DDL命令是自动提交”的概念是在Oracle中,我把它和SQL Server混合在一起,弄糊涂了。现在请告诉我,在事务、提交、回滚方面,DDL和DML之间有什么区别吗…@user369182-我想不起来。上的页面有一个受模式选择影响的语句列表。@Damien_不信者,我能请你将你的评论整合到你的答案中吗?首先是“DDL与sql server中的自动提交无关”。这里的问题是,默认情况下,oracle中的事务是显式的,DDL会“自动提交”这些显式事务。所以,有人想看看sql server中是否也存在这种情况,他们找到了这个答案,乍一看,他们相信这是真的。或者我们将问题修改为“什么是sql server中的自动提交”