您只是阅读有关使用事务scrope的信息,之前我习惯于在单个数据库类中进行事务处理,例如
try
{
con.Open();
tran = con.BeginTransaction();
OleDbCommand myCommand1 = new OleDbCommand(query1, con);
OleDbCommand myCommand2 = new OleDbCommand(query2, con);
myCommand .Transaction = tran;
// Save Master
myCommand1.ExecuteNonQuery();
// Save Childred
myCommand2.ExecuteNonQuery();
// Commit transaction
tran.Commit();
}
catch (OleDbException ex)
{
tran.Rollback();
lblError.Text = "An error occured " + ex.ToString();
}
finally
{
if (con != null)
{
con.Close();
}
}
但是现在我开始知道我可以简单地通过使用事务范围对象并使用单独的数据库类来执行业务逻辑层内的事务,如
public static int Save(Employee myEmployee)
{
using (TransactionScope myTransactionScope = new TransactionScope())
{
int RecordId = EmpDB.Save(myEmployee);
foreach (Address myAddress in myEmployee.Addresses)
{
myAddress.EmployeeId = EmployeeId;
AddressDB.Save(myAddress);
}
foreach (PhoneNumber myPhoneNumber in myEmployee.PhoneNumbers)
{
myPhoneNumber.EmployeeId = EmployeeId;
PhoneNumberDB.Save(myPhoneNumber);
}
myTransactionScope.Complete();
return EmployeeId;
}
}
推荐的编码方法是哪一个?为什么?使用交易范围是否安全?这是最新的做事方式吗?我对这两种方法都很困惑。
提前致谢。
答案 0 :(得分:1)
事务范围的一个好处是你不需要try / catch块。您只需在作用域上调用Complete即可提交事务,如果发生异常,它将自动回滚。
您还可以使用其他能够参与事务的组件,而不仅仅是数据库连接。这是因为组件(包括连接)在当前线程上查找Transaction。这是通过调用
创建的事务using (TransactionScope myTransactionScope = new TransactionScope())