繁体   English   中英

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

[英]Wait for other transaction to commit/rollback before beginning another transaction?

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

有可能这样吗?

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

cmd.Connection.BeginTransaction(IsolationLevel.ReadCommitted);

要么

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

参考

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM