程序出现data is locked的情况 返回

SqlSugar 沟通中
14 229

最近一个项目,偶尔出现data is locked的情况,我看过文档了,说这个很正常,但是我的疑虑是它提示这个之后,有没有把数据插入到数据库里,我的数据库代码如下:

public class DataBaseHelper

{


    /// <summary>

    /// 逻辑单例

    /// </summary>

    private static SqlSugarScope db;


    /// <summary>

    /// 获取数据库实例

    /// </summary>

    /// <param name="conStr">连接字符串</param>

    /// <param name="dbType">数据库类型</param>

    /// <returns>一个数据库实例</returns>

    public static SqlSugarScope GetInstance(string conStr, DbType dbType)

    {

        if (db == null)

        {

            db = new SqlSugarScope(new ConnectionConfig()

            {

                ConnectionString = conStr,

                DbType = dbType,

                IsAutoCloseConnection = true,

                LanguageType = LanguageType.Chinese

            });

        }

        return db;

    }


    /// <summary>

    /// 初始化数据库和表<br/>

    /// 数据库类型:1:Mysql 2:SqlServer 3:Sqlite 4:Oracle

    /// </summary>

    /// <param name="typeList">类型列表</param>

    /// <param name="connectionString">连接字符串</param>

    /// <param name="dbType">数据库类型</param>

    /// <returns>初始化成功则为true,否则为false</returns>

    public CommonResponse<bool> Init(List<Type> typeList, string connectionString, DbType dbType)

    {

        try

        {

            GetInstance(connectionString, dbType);

            db.DbMaintenance.CreateDatabase();

            db.CodeFirst.InitTables(typeList.ToArray());

            return new CommonResponse<bool> { Success = true, Data = true, Msg = "初始化数据库和表成功!" };

        }

        catch (Exception ex)

        {

            return new CommonResponse<bool> { Success = false, Msg = $"初始化数据库和表失败:{ex.Message}" };

        }

    }


    /// <summary>

    /// 单个添加数据

    /// </summary>

    /// <typeparam name="T">类型</typeparam>

    /// <param name="data">数据</param>

    /// <returns>添加成功则为true,否则为false</returns>

    public async Task<CommonResponse<bool>> AddData<T>(T data)

    {

        try

        {

            var result = await db.InsertableByObject(data).ExecuteCommandAsync();

            bool isOK = result > 0;

            return new CommonResponse<bool> { Success = isOK,  Msg = isOK ? "添加数据成功!" : "添加数据失败,请检查数据是否有误!" };

        }

        catch (Exception ex)

        {

            return new CommonResponse<bool> { Success = false, Msg = $"添加数据异常:{ex.Message}" };

        }

    }

}

热忱回答14

  • 只要不进error都是正常的

    0 回复
  • @fate sta:它进了catch,说明是抛了异常的

    0 回复
  • 你发的是公用方法。

    发出业务中

    使用AddData的具体代码,具体报错的业务代码

    0 回复
  • 有没有定时任务等。

    0 回复
  • @fate sta:类似这样的,开一个task去执行qy.png

    0 回复
  • @fate sta:可能是我使用了并发执行搞得鬼,我在多线程里面为了提高效率,有些是这样写的:

     var task= AddCacheInfo("ExDic", ExDic);

     var task2= AddCacheInfo("InfoDic", InfoDic);

     await Task.WhenAll(task, task2);


    0 回复
  • @不知昵称: TaskAll内的db要加 db.CopyNew

    0 回复
  • @fate sta:好的,task.whenall的我按照这样试一下,但是在一个按钮里不用task.whenall,它也会报这个错误,这又是为什么:

    private async void btnStart_Click(object sender, EventArgs e)

    {

    await CORE.Instance.AddCacheInfo("LockList", CORE.Instance.LockDic);

    await CORE.Instance.AddCacheInfo("DataList", CORE.Instance.DataList);

    }

    0 回复
  • db.CopyNew()加上测试一下。

    0 回复
  • 还有疑问提供完整的可以重现的DEMO。局部代码能看出的东西有限

    0 回复
  • @fate sta:如果滥用db.copynew,会有什么问题吗

    0 回复
  • @不知昵称: 唯一注意的是事务,其他方面没什么问题

    var newdb=db.CopyNew();
    newdb.BeginTran()
    下面所有都要用newdb保证事务


    0 回复
  • @fate sta:好的,谢谢

    0 回复
  • @fate sta:db.copynew不需要使用using关闭吗,它会自动关闭吗

    0 回复