事务锁

乐观锁

使用场景:多个用户相近的时间打开编辑框 ,然后A用户在在五分钟后提交, B用户在十分钟后提交那么B用户肯定会覆盖A用户编辑的内容

具体用法: https://www.donet5.com/Home/Doc?typeId=2399


悲观锁等待模式

新功能 :5.0.8.3-preview02

数据库支持SqlServerPgSqlOracleMySql

2个相同的业务代码 同时执行时必须等待 第一个执行成功后执行

主键查询一般是行锁,如果非主键可以会变成表锁

db.BeginTran();
//查询条件记录后锁表
var data=db.Queryable<Order>().TranLock(DbLockType.Wait).Where(it=>it.Id==1).ToList();//返回条数尽量最少尽量主键
//插入、更新等操作
.......
db.CommitTran();



悲观锁排它模式

数据库支持SqlServerPgSqlOracleMySql 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();

测试代码:

用的来验证是否扔出异常

for (int i = 0; i < 10; i++)
{
    Task.Run(() =>
    {
        try
        {
            var db = GetInstance();//用的sqlsugarclient保证db线程安全每次New一下
            db.BeginTran();
            var getAll = db.Queryable<Order>().TranLock(DbLockType.Error).ToList();
            System.Threading.Thread.Sleep(1000);
            db.CommitTran();
            Console.WriteLine("成功");
        }
        catch (Exception ex)
        {

            Console.WriteLine("失败");
        }
    });
}

image.png

关闭
果糖网