我最近开始使用现有项目,它可以与Microsoft.Practices.EnterpriseLibrary.Data对象一起使用。
现在我想在一个事务中执行多个存储过程(1:n插入必须全部失败或成功)
但我不知道如何......
任何人都可以帮助我吗?
在此项目中执行sp的典型代码如下所示:
Database oDatabase = DatabaseFactory.CreateDatabase(CONNECTION_STRING_KEY);
DbCommand oDbCommand = oDatabase.GetStoredProcCommand("upCustomer_Insert");
Int32 iCustomerKey = 0;
oDatabase.AddInParameter(oDbCommand, "Firstname", DbType.String, p_oCustomer.FirstName);
oDatabase.AddInParameter(oDbCommand, "Lastname", DbType.String, p_oCustomer.LastName);
oDatabase.ExecuteNonQuery(oDbCommand);
答案 0 :(得分:6)
您需要使用 DbTransaction :
using (DbConnection connection = db.CreateConnection())
{
connection.Open();
DbTransaction transaction = connection.BeginTransaction();
try
{
db.ExecuteNonQuery(transaction, sp1);
db.ExecuteNonQuery(transaction, sp2);
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
注意 ExecuteNonQuery 的第一个参数是如何使用的事务。
更多信息here。
答案 1 :(得分:1)
但事务范围不是线程安全的。你不能将它用于多线程应用程序就是我所读过的。这是一个真正的PITA整体。 MS似乎还不了解如何充分扩展软件系统。
答案 2 :(得分:0)
您可以在transactioncope中包装调用,请参阅:http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx