[英]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.