我想运行在多个表上多重插入语句。 我使用dapper.net。 我看不出有任何的方式来处理与dapper.net交易。
请分享你如何使用交易与dapper.net想法。
我想运行在多个表上多重插入语句。 我使用dapper.net。 我看不出有任何的方式来处理与dapper.net交易。
请分享你如何使用交易与dapper.net想法。
下面的代码片段:
using System.Transactions;
....
using (var transactionScope = new TransactionScope())
{
DoYourDapperWork();
transactionScope.Complete();
}
请注意,您需要添加参考System.Transactions
,因为它默认情况下不引用程序集。
我更喜欢直接从连接获取事务用更直观的方法:
// This called method will get a connection, and open it if it's not yet open.
using (var connection = GetOpenConnection())
using (var transaction = connection.BeginTransaction())
{
connection.Execute(
"INSERT INTO data(Foo, Bar) values (@Foo, @Bar);", listOf5000Items, transaction);
transaction.Commit();
}
您应该能够使用TransactionScope
因为小巧玲珑的运行只是ADO.NET命令。
using (var scope = new TransactionScope())
{
// insert
// insert
scope.Complete();
}
考虑到所有的表都在单一的数据库,我不同意TransactionScope
在这里的一些答案建议解决方案。 请参考此答案。
TransactionScope
通常用于分布式事务; 交易跨越不同的数据库可以是不同的系统上。 这需要操作系统,如果没有这些,这将不起作用SQL Server上的一些配置。 这是不推荐,如果您所有的疑问都对数据库的单个实例。
但是,与单一的数据库,当你需要在交易的代码,是不是你的控制之下,这可能是有用的。 与单一的数据库,它不需要任何特殊的配置。
connection.BeginTransaction
是针对单个数据库ADO.NET语法来实现事务(在C#,VB.NET等)。 这不跨多个数据库工作。
所以, connection.BeginTransaction()
是更好的出路。
即使是更好的方式来处理事务,是落实的UnitOfWork在解释这个答案。
丹尼尔的回答和预期一样对我。 为了完整起见,这里是一个演示提交和使用事务范围和短小精悍回滚一个片段:
using System.Transactions;
// _sqlConnection has been opened elsewhere in preceeding code
using (var transactionScope = new TransactionScope())
{
try
{
long result = _sqlConnection.ExecuteScalar<long>(sqlString, new {Param1 = 1, Param2 = "string"});
transactionScope.Complete();
}
catch (Exception exception)
{
// Logger initialized elsewhere in code
_logger.Error(exception, $"Error encountered whilst executing SQL: {sqlString}, Message: {exception.Message}")
// re-throw to let the caller know
throw;
}
} // This is where Dispose is called