如果在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
这样可能吗?
答案 0 :(得分:1)
使用 IsolationLevel.ReadCommitted ,您可以避免通过其他交易访问交易中涉及的表
cmd.Connection.BeginTransaction(IsolationLevel.ReadCommitted);
或
您可以使用TransactionScope类。 TransactionScope使代码块处于事务状态,直到代码未提交,表将被锁定,如果其他一些请求同一个表,则它必须等到提交或回滚正在运行的事务。