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

最近一个项目,偶尔出现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)
-
fate sta VIP0
1周前只要不进error都是正常的
0 回复 -
不知昵称 VIP0
1周前@fate sta:它进了catch,说明是抛了异常的
0 回复 -
fate sta VIP0
1周前你发的是公用方法。
发出业务中
使用AddData的具体代码,具体报错的业务代码
0 回复 -
fate sta VIP0
1周前有没有定时任务等。
0 回复 -
不知昵称 VIP0
1周前@fate sta:类似这样的,开一个task去执行
0 回复 -
不知昵称 VIP0
1周前@fate sta:可能是我使用了并发执行搞得鬼,我在多线程里面为了提高效率,有些是这样写的:
var task= AddCacheInfo("ExDic", ExDic);
var task2= AddCacheInfo("InfoDic", InfoDic);
await Task.WhenAll(task, task2);
0 回复 -
fate sta VIP0
1周前@不知昵称: TaskAll内的db要加 db.CopyNew
0 回复 -
不知昵称 VIP0
1周前@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 回复 -
fate sta VIP0
1周前db.CopyNew()加上测试一下。
0 回复 -
fate sta VIP0
1周前还有疑问提供完整的可以重现的DEMO。局部代码能看出的东西有限
0 回复 -
不知昵称 VIP0
1周前@fate sta:如果滥用db.copynew,会有什么问题吗
0 回复 -
fate sta VIP0
1周前@不知昵称: 唯一注意的是事务,其他方面没什么问题
var newdb=db.CopyNew(); newdb.BeginTran() 下面所有都要用newdb保证事务
0 回复 -
不知昵称 VIP0
1周前@fate sta:好的,谢谢
0 回复 -
不知昵称 VIP0
1天前@fate sta:db.copynew不需要使用using关闭吗,它会自动关闭吗
0 回复