使用场景:多个用户相近的时间打开编辑框 ,然后A用户在在五分钟后提交, B用户在十分钟后提交那么B用户肯定会覆盖A用户编辑的内容
具体用法: https://www.donet5.com/Home/Doc?typeId=2399
新功能 :5.0.8.3-preview02
| 数据库支持 | SqlServer | PgSql | Oracle | MySql |
2个相同的业务代码 同时执行时必须等待 第一个执行成功后执行
主键查询一般是行锁,如果非主键可以会变成表锁
db.BeginTran(); //查询条件记录后锁表 var data=db.Queryable<Order>().TranLock(DbLockType.Wait).Where(it=>it.Id==1).ToList();//返回条数尽量最少尽量主键 //插入、更新等操作 ....... db.CommitTran(); //异常要加上 db.RollBackTran();
| 数据库支持 | SqlServer | PgSql | Oracle | MySql 8.0+ |
新功能 :5.0.8.3-preview02
2个相同的业务代码 同时执行时只会生效一个,其它都扔出错误
db.BeginTran(); //查询条件记录后锁表 var data = db.Queryable<Order>().TranLock(DbLockType.Error).Where(it=>it.Name=="a").ToList();//返回条数尽量最少 for update UPDLOCK //插入、更新等操作 ....... db.CommitTran(); //异常要加上 db.RollBackTran();
测试代码:
用的来验证是否扔出异常
for (int i = 0; i < 10; i++)
{
Task.Run(() =>
{
var db = GetInstance();//用的sqlsugarclient保证db线程安全每次New一下
try
{
db.BeginTran();
var getAll = db.Queryable<Order>().TranLock(DbLockType.Error).ToList();
System.Threading.Thread.Sleep(1000);
db.CommitTran();
Console.WriteLine("成功");
}
catch (Exception ex)
{
db.RollBackTran();
Console.WriteLine("失败");
}
});
}
2016 © donet5.comApache Licence 2.0