在大多数页面上我都读过“DDL命令在SQL Server中有自动提交”,如果我没有错,这个语句只是意味着我们不需要显式的DDL命令提交命令。
然后为什么......
1)更改表EMP添加年龄INT;
更新EMP SET年龄= 20;
失败,说无效的列名称'Age'
2)BEGIN TRAN
更改表EMP添加年龄INT;
ROLLBACK
可以成功回滚。
也许我对AutoCommit的概念有误,请用实例解释一下它的实际效果。
感谢您的帮助。
答案 0 :(得分:6)
与数据库引擎实例的连接以自动提交模式运行,直到
BEGIN TRANSACTION
语句开始...
所以,你的第二个例子不适用。再往下:
在自动提交模式下,有时看起来好像数据库引擎的实例已回滚整个批处理而不是只回滚一个SQL语句。如果遇到的错误是编译错误,而不是运行时错误,则会发生这种情况。编译错误会阻止数据库引擎构建执行计划,因此批处理中不会执行任何操作。
这是你的第一个例子。
因此,两人实际上都没有处理Autocommit交易。
所以,让我们采取如下声明:
Alter TABLE EMP Add Age INT;
如果您在自动提交模式下有一个打开的连接,执行上述操作,并且完成没有错误,那么您会发现此连接没有打开的事务,并且更改对任何其他连接都是立即可见的。
如果你在隐式事务模式下有一个打开的连接,执行上面的操作,它完成没有错误,那么你会发现这个连接有一个打开的事务。对于EMP
上需要架构锁定的任何操作,其他连接都将被阻止,直到您执行COMMIT
或ROLLBACK
。
如果你有一个打开的连接,你已经执行了BEGIN TRANSACTION
,执行上面的操作,它完成没有错误 - 那么你将处于与隐式交易相同的情况。但是,如果COMMIT
ed或ROLLBACK
ed,则您的连接将恢复为自动提交模式或隐式事务模式(在调用BEGIN TRANSACTION
之前处于活动状态)。
答案 1 :(得分:0)
如果您在第二个示例中明确地使用了begin tran,那么您必须提交它。 (你也可以回滚)
如果你没有在第一个例子中明确指出它,那么它就是自动提交。
autocommit是sql server中的默认模式,如果需要可以关闭
答案 2 :(得分:0)
如果您在代码中添加批处理,它将起作用
Alter TABLE EMP Add Age INT;
go
UPDATE EMP SET Age=20;