gpt4 book ai didi

c# - 在开始另一个事务之前等待其他事务提交/回滚?

转载 作者:行者123 更新时间:2023-11-29 13:38:24 26 4
gpt4 key购买 nike

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

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

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.ReadCommited,您可以避免其他事务访问某个事务涉及的表

cmd.Connection.BeginTransaction(IsolationLevel.ReadCommitted);

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

refer

关于c# - 在开始另一个事务之前等待其他事务提交/回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18457955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com