等待其他事务提交/回滚,然后再开始另一个事务

本文关键字:事务 然后 再开始 另一个 其他 提交 等待 回滚 | 更新日期: 2023-09-27 18:29:04

如果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

有可能这样吗?

等待其他事务提交/回滚,然后再开始另一个事务

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

cmd.Connection.BeginTransaction(IsolationLevel.ReadCommitted);

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

参考