在开始另一个事务之前等待其他事务提交/回滚?

时间:2013-08-27 05:54:34

标签: c# mysql .net-4.0 transactions mysql-connector

如果在MySQL中仍有未提交/取消支持的事务,如何使我的事务等待?

目前我在代码端进行交易,而不是在DB存储过程方面进行,如下所示:

cmd.Connection.BeginTransaction();
try {
    // db codes here
    cmd.Transaction.Commit();
} catch {
    cmd.Transaction.Rollback();
    throw;
} finally {
    cmd.Connection.Close();
}

我希望其他事务等到上一个事务完成。因为在我的一些存储过程中,我在插入外键时得到MAX(id),其中id是一个自动递增的列,也是在同一个事务上创建的。但是当两个事务同时发生时,它在我当前的设置上不起作用,发生的事情是这样的:

Begin Trans1
Begin Trans2
Trans1: insert a values(); --id = 1
Trans2: insert a values(); --id = 1
Trans1: insert b(aid, col1) values((select MAX(id) from a), 'test'); --aid = 1
Trans2: insert b(aid, col1) values((select MAX(id) from a), 'test'); --aid = 1
Commit Trans1
Commit Trans2 --id = 2, aid = 1

我希望是这样的:

Begin Trans1
Wait Trans2
Trans1: insert a values(); --id = 1
Trans1: insert b(aid, col1) values((select MAX(id) from a), 'test'); --aid = 1
Commit Trans1
Begin Trans2
Trans2: insert a values(); --id = 2
Trans2: insert b(aid, col1) values((select MAX(id) from a), 'test'); --aid = 2
Commit Trans2

这样可能吗?

1 个答案:

答案 0 :(得分:1)

使用 IsolationLevel.ReadCommitted ,您可以避免通过其他交易访问交易中涉及的表

cmd.Connection.BeginTransaction(IsolationLevel.ReadCommitted);

您可以使用TransactionScope类。 TransactionScope使代码块处于事务状态,直到代码未提交,表将被锁定,如果其他一些请求同一个表,则它必须等到提交或回滚正在运行的事务。

refer