0

如果 MySQL 中仍有未提交/未回滚的事务,我如何让我的事务等待?

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

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

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

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

有可能这样吗?

4

1 回答 1

1

通过使用IsolationLevel.ReadCommitted可以避免其他事务访问事务中涉及的表

cmd.Connection.BeginTransaction(IsolationLevel.ReadCommitted);

或者

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

参考

于 2013-08-27T06:25:14.957 回答