当我单击表单上的保存按钮时
它调用了 3 个方法:
save_Purchase();
save_dtPurcaseProduct();
save_dtPurchaseProductExp();
这 3 种方法将更改保存到 3 个数据库表
所以情况是所有 3 个表都应该更新,或者没有一个表应该得到更新。
我使用 C# 和 Microsoft sql server 作为数据库
当我单击表单上的保存按钮时
它调用了 3 个方法:
save_Purchase();
save_dtPurcaseProduct();
save_dtPurchaseProductExp();
这 3 种方法将更改保存到 3 个数据库表
所以情况是所有 3 个表都应该更新,或者没有一个表应该得到更新。
我使用 C# 和 Microsoft sql server 作为数据库
如果您不想重写函数,可以使用TransactionScope:
using (TransactionScope scope = new TransactionScope())
{
try
{
save_Purchase();
save_dtPurcaseProduct();
save_dtPurchaseProductExp();
scope.Complete(); //All goes well, then commit your transaction
}
catch(Exception ex)
{
//Do not call complete, on exit of transactionscope, transaction will rollback
}
}
所有更新语句必须在里面transaction
。更多的
如果您正在使用Stored procedure
以下方法编写存储过程。即所有三个Update
语句inside a single transaction
。这样您就可以在所有内容都更新时提交它,否则它将被回滚
CREATE/ALTER PROCEDURE Proc_Name
AS
BEGIN TRY
BEGIN TRAN
-- Your Update Statements
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
END CATCH
如果您使用 SQL 查询和 ADO
使用以下方法
private static void Update()
{
SqlConnection db = new SqlConnection("strConectionString");
SqlTransaction transaction;
db.Open();
transaction = db.BeginTransaction();
try
{
new SqlCommand("update quey1", db, transaction)
.ExecuteNonQuery();
new SqlCommand("update quey2", db, transaction)
.ExecuteNonQuery();
new SqlCommand("update quey3", db, transaction)
.ExecuteNonQuery();
transaction.Commit();
}
catch (SqlException sqlError)
{
// always log or rethrow exceptions!
transaction.Rollback();
db.Close();
//
throw;
}
db.Close();
}
[已编辑]当您确实遇到故障时,您应该始终记录(如果可以处理)或重新抛出它。否则,异常跟踪和关键诊断信息将被吞入“catch”块中。
在这种情况下,我建议重新向外抛出——因为最外层的系统或应用程序线程应该处理异常,并在此时记录它。如果发生异常,则更新显然失败并且业务逻辑不应继续。
而不是向数据库发送 3 个调用。您应该编写一个为您执行所有 3 个功能的存储过程。你应该在那里申请交易。如何在存储过程中实现事务。
如果您想保留这 3 种方法,那么您还可以在代码级别应用事务。
SqlConnection conn = new SqlConnection("Your Connection string");
conn.Open()
using (SqlTransaction tran = conn.BeginTransaction()) {
try {
// your code
tran.Commit();
} catch {
tran.Rollback();
throw;
}
}