事务问题“One or more errors occurred” 返回

SqlSugar
22 182
该叫什么 smallxin 发布于2周前
悬赏:5 飞吻
        [Fact]
        public async void UnitOfWork()
        {
            SunnyBaseEntity sunnyBaseEntity = new SunnyBaseEntity()
            {
                orderId = "",
                type = "1",
                lfuseId = "",//product_id,
                rqcode = "",
                process = "L",
                mac = "",
                userId = 0,
                userCode = "",
                createTime = DateTime.Now,
            };
            try
            {
                _unitOfWork.BeginTran();
                bool result = true;
                SunnyResult sunnyResult = new SunnyResult(sunnyBaseEntity);
                //dic = new Dictionary<string, Dictionary<string, string>>();
                sunnyResult.type = "1";
                var resultid = await _sunnyResultServices.InsertInSplitAsync(sunnyResult);
                System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
                watch.Start();
                for (int i = 0; i < 3; i++)
                {
                    bool flag = await CalTestItem(resultid, sunnyBaseEntity);
                    if (!flag) result = false;
                }
                watch.Stop();
                await _sunnyResultServices.UpdateInSplitAsync(DateTime.Now, it => new SunnyResult()
                {
                    timeSpan = watch.ElapsedMilliseconds,
                    deviceType = ControlDeviceTypes.Camera,
                    createTime = DateTime.Now,
                    resultParams = null,
                    NGParams = null,
                    result = result
                }, p => p.guid == resultid);

              //在这里执行完就一直卡在这了

                _unitOfWork.CommitTran();
            }
            catch (Exception ex)
            {
                _unitOfWork.RollbackTran();
            }
        }
        public async Task<bool> CalTestItem(long resultid, SunnyBaseEntity sunnyBaseEntity)
        {
            Dictionary<string, string> ngValues = new Dictionary<string, string>();
            Dictionary<string, string> keyValues = new Dictionary<string, string>();
            Dictionary<string, string> processkeyValues = new Dictionary<string, string>();
            bool result = true;
            DateTime timebegin, timeend;
            TimeSpan timeused;
            timebegin = DateTime.Now;
            timeend = DateTime.Now;
            timeused = timeend.Subtract(timebegin);
            sunnyBaseEntity.timeSpan = timeused.TotalMilliseconds;
            sunnyBaseEntity.deviceType = ControlDeviceTypes.Camera;
            sunnyBaseEntity.createTime = DateTime.Now;
            sunnyBaseEntity.NGParams = ngValues.Count == 0 ? null : JsonConvert.SerializeObject(ngValues).Replace("\"", "").Replace("{", "").Replace("}", "").Replace(",", " , ").Replace('"', ' ').Trim();
            sunnyBaseEntity.result = result;

            SunnyResultItem sunnyResultItem = new SunnyResultItem(sunnyBaseEntity);
            sunnyResultItem.resultParams = JsonConvert.SerializeObject(keyValues).Replace("\"", "").Replace(",", " , ").Replace("{", "").Replace("}", "").Replace('"', ' ').Trim();
            sunnyResultItem.resultId = resultid;
            return await _sunnyResultItemServices.InsertInSplitAsync(sunnyResultItem) > 0;
        }



image.png


热忱回答22

  •  "SqlConnection": "Server=.;uid=sa;pwd=y123123!@;Database=SunnyARTest;MultipleActiveResultSets=true;pooling=true;min pool size=5;max pool size=32767;connect timeout=20;Encrypt=True;TrustServerCertificate=True;",

    0 回复
  • image.png

    0 回复
  • 这个一般异步用法错误,检查有没有异步方法漏掉AWAIT ,暂时看不出问题,如果还有疑问提供完整的控制台或者API DEMO

    0 回复
  • 还有把这个设为 MultipleActiveResultSets=false 如果出现 The connection does not support MultipleActiveResultSets 这个错

    那么100%异步是有 不是TASK方法或者少写了AWAIT

    0 回复
  • 1、我这样的写法没有问题是吗? 刚才排查了下确实有个地方漏写了await。

    疑问:如果用异步的话,在事务没有提交的情况下,更新之前插入表的数据,会不会造成锁表导致超时?

    2、在 _unitOfWork.CommitTran();之后过段时间就会出现

    image.png


    0 回复
  • 事务要满足 db.contextidID从开启到插入更新 到提交是同一个

    0 回复
  • 代码注释排除 法找出错误代码,排除到最简 把DEMO整理出来

    0 回复
  • image.pngcontextid没有变化

    0 回复
  • @smallxin:插入更新也要一样

    0 回复
  • 如果还有疑问需要提供完整测试用例

    0 回复
  • 1、问题:只执行插入操作的情况下提交事务也会出现;

    2、提问:分表的情况下支持事务吗?

    3、说明:事务始终走的是单例模式  _sqlSugarClient = DbScoped.SugarScope;

         插入的操作:(疑问:使用插入操作时有没有事务?)

    image.png

    4、提问:事务隔离级别在哪里进行设置?

    5、提问:走单例模式的情况下,如果显式使用_unitOfWork是不是代表全局全部走这个事务?还是每个单表封装的增删改查操作里面再嵌套一个事务?

    0 回复
  • @smallxin:提供用例,这个讲不清楚

    0 回复
  • 正常事务都是支持的

    0 回复
  • 找到问题啦!

    image.png

    反复试过了问题就是出现在这,使用 if (!_dbBase.Ado.IsValidConnection())这种判断方式时提交事务时就会出现“事务已提交,不再使用”,

    请问下哪里可以看下这个方法封装的内容?

    请问想要判断下服务器是否可以连接、数据库是否可以正常连接该如何判断?

    0 回复
  • @smallxin:这个本来就不能出现在事务中

    0 回复
  • 有释放操作

    0 回复
  • 请问有没有其他解决方案呀

    0 回复
  • @smallxin:事务不应该在切换数据库的地方开启

    0 回复
  • sqlsugar注入切换数据库后,通过构造函数注入服务会默认启用注入的第一个连接参数


    image.pngimage.png

    image.png

    0 回复
  • IsValidConnection我加重载 不关掉connection 要能最好方案这样你事务不受影响

    0 回复
  • db.Ado.IsValidConnectionNoClose 后面预览版本加上这个方法

    0 回复
  • 使用事务,所有增删改查是不是必须以异步方式进行?

    0 回复