如果我们不指定事务关键字,SQL Server会记录更改吗?

4
如果我们不指定“Begin Trans”、“Commit Trans”等等,而只是使用像这样的简单SQL语句:
delete from myTable where id = 1 

在存储过程内部,

  1. SQL Server会将更改写入事务日志吗?如果是,则在没有指定Begin Trans关键字的情况下,我们如何使用它们(无法使用RollBack)。

  2. 编写存储过程时,总是使用事务关键字是一种好习惯,还是在适当时使用它们更好(例如当我们需要回滚更改时)?

编辑:谢谢大家。但是我的问题1的第二部分怎么样?如何通过使用事务日志恢复数据?


回复:你的编辑更适合在serverfault.com上提问,但你需要查找的短语是“时间点恢复”。你需要采取的步骤在这里描述。 - Martin Smith
2个回答

4
默认情况下,SQL Server 在“自动提交”模式下运行,这意味着每个语句都是自动处于其自己的事务中,并且会自动提交并写入事务日志(或在出现错误时自动回滚)。一旦提交了事务,就无法回滚,您需要从最后一个备份进行恢复以纠正任何错误(前提是有可用的最后一个备份和恢复模型)。
您可以通过使用set implicit_transactions on来更改此行为,在此之后,仅在发出commit命令之前,所有内容才被提交。
关于存储过程的问题,如果您有多个需要原子处理的语句,则需要显式事务控制语句;否则,它是可选的。

0

SQL Server总是并且只能使用可用和启用的事务日志,因此没有办法告诉SQL Server不使用它,这是“按设计”而来。

这并不排除在某些情况下,您可以使用某些命令或命令选项来告诉SQL Server最小化日志写入,例如TRUNCATEDELETE不同,因为数据被删除并且不会记录在日志中。在其他情况下,您可以为某些批量命令指定日志级别以最小化日志记录。

话虽如此,如果您在管理工作室或代码中执行命令并且未指定任何事务(Begin、Commit或Rollback),SQL Server将立即提交。

我不是很懂SQL,但我知道有AutoCommit的概念,它可以更改或设置为与默认级别不同的级别。

您上面的删除将立即应用更改,并将信息写入日志。

通常,在存储过程中,我们不会在存储过程体内注入BEGIN和COMMIT或ROLLBACK,而是从C# DAL使用BeginTrans/Commit或Rollback。

还有其他的方法可以实现,如果在同一个存储过程中涉及多个表,将本地事务放在其中可能是有意义的,但也可以从代码中实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接