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" 被删除,那么客户端代码所做的就属于范围。不过,这有点超出了原始问题的范围。
文档是否引用了这个答案:
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" 被删除,那么客户端代码所做的就属于范围。不过,这有点超出了原始问题的范围。