LINQ2SQL是否自动将ExecuteCommand放入事务中

Does LINQ2SQL automatically put ExecuteCommand in a transaction

文档是否引用了这个答案:

When you call SubmitChanges, LINQ to SQL checks to see whether the call is in the scope of a Transaction or if the Transaction property (IDbTransaction) is set to a user-started local transaction. If it finds neither transaction, LINQ to SQL starts a local transaction (IDbTransaction) and uses it to execute the generated SQL commands. When all SQL commands have been successfully completed, LINQ to SQL commits the local transaction and returns.

适用于.ExecuteCommand()方法?换句话说,我可以相信以下删除是在事务中处理的,如果失败会自动回滚,还是我需要手动告诉它使用事务,如果是的话如何?我应该使用 TransactionScope 吗?

using(var context = Domain.Instance.GetContext())
{
    context.ExecuteCommand("DELETE FROM MyTable WHERE MyDateField = {0}", myDate)
}

每个 SQL 语句,无论是否包含在显式事务中,都以事务方式发生。因此,无论是否显式事务,单个语句总是 atomic —— 它们要么完全发生,要么根本不发生。在上面的示例中,要么删除所有符合条件的行,要么删除其中 none 行——这与客户端代码执行的操作无关。实际上没有办法让 SQL 服务器部分删除行;即使拔掉电源线也仅仅意味着当服务器重新启动并读取事务日志时,为删除所做的任何操作都将被撤消。

唯一美中不足的是,哪些行匹配可能因语句锁定方式而异。该语句逻辑上分为两个阶段,第一个阶段确定将删除哪些行,第二个阶段实际删除它们(在更新锁下)。比方说,如果您发出了这条语句,并且在它 运行 时发出了 INSERT 插入了匹配 DELETE 条件的行,无论该行是否在数据库中 DELETE 已完成取决于对语句有效的事务隔离级别。因此,如果您希望 实用 保证 "all rows" 被删除,那么客户端代码所做的就属于范围。不过,这有点超出了原始问题的范围。