【发布时间】:2010-05-04 02:52:38
【问题描述】:
谁能帮助我如何验证交易
示例:
transaction = mySqlConn.BeginTransaction(IsolationLevel.ReadCommitted)
如果还有一个打开的事务,那么上面的代码将忽略..在打开新事务之前如何知道是否有一个事务尚未提交以避免嵌套事务?
【问题讨论】:
标签: .net vb.net transactions
谁能帮助我如何验证交易
示例:
transaction = mySqlConn.BeginTransaction(IsolationLevel.ReadCommitted)
如果还有一个打开的事务,那么上面的代码将忽略..在打开新事务之前如何知道是否有一个事务尚未提交以避免嵌套事务?
【问题讨论】:
标签: .net vb.net transactions
您是否考虑过使用System.Transactions.TransactionScope?它旨在处理这种类型的场景implicitly,而无需编写自定义代码。
如果您要使用显式事务管理而不使用 System.Transactions,您将不得不传递您的事务对象(或以某种方式使其可用),并且您需要决定何时开始事务。例如检查 SqlTransaction 是否为空,如果是则启动事务,否则只需使用现有事务。
你可以做这样的事情(transaction.Rollback() 的错误处理被省略):
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlTransaction transaction = null;
DoSomething(connection, ref transaction);
DoSomethingElse(connection, ref transaction);
transaction.Commit();
}
public void DoSomething(SqlConnection connection, ref SqlTransaction transaction)
{
SqlCommand command = connection.CreateCommand();
transaction = GetTransaction(connection, transaction);
command.Connection = connection;
command.Transaction = transaction;
...
}
public void DoSomethingElse(SqlConnection connection, ref SqlTransaction transaction)
{
...
}
public SqlTransaction GetTransaction(SqlConnection connection, SqlTransaction transaction)
{
if (transaction == null)
{
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);
}
return transaction;
}
但通常您只需创建您的事务并将其传递给其他方法,并了解它已经被初始化并且可以安全使用。
【讨论】: