事务

重要的事情说三遍:

事务只能在同一个SqlSugarClient对象有效,事务只能在同一个SqlSugarClient对象有效,事务只能在同一个SqlSugarClient对象有效,跨SqlSugarClient对象请用分布式事务


MySql特殊的库或表不支持事务,所以如果是用MYSQL的朋友需要注意了


正确用法:

用法1: 无数据返回只返回状态

var result = db.Ado.UseTran(() =>
{
    var beginCount = db.Queryable<Student>().Count();
    db.Ado.ExecuteCommand("delete student");
    //throw new Exception("error haha"); 测试代码
});

// result.ErrorException
// result.IsSuccess


用法2:返回数据并且返回状态

var result2 = db.Ado.UseTran<List<Student>>(() =>
{
    return db.Queryable<Student>().ToList();
});
// result.ErrorException
// result.IsSuccess
// result.Data


用法3: 使用try catch来处理事务,用这种方式事务一定要加try catch回滚不然会锁表,在操作就卡死

try
{
 db.Ado.BeginTran();
 操作
 db.Ado.CommitTran();
}
catch (Exception ex)
{
 db.Ado.RollbackTran();
 throw ex;
}


错误用法,创建了3个db对象

{9LGEVS(WE_8_6WJG4NO]3L.png

正确写法

var db=GetAll(); //GetAll是获取新的Db实例的方法
db.Ado.SqlQuery<T>(sql)



跨类事务方案

http://www.codeisbug.com/Doc/8/1158




4.7 异步事务的支持

因为Async方法在事务中无效所以对于多个SqlSugar方法进行事务操作并且能够实现异步增加了该功能

            //无返回值只返回状态
            var asyncResult = db.Ado.UseTranAsync(() =>
            {

                var beginCount = db.Queryable<Student>().ToList();
                db.Ado.ExecuteCommand("delete student");
                var endCount = db.Queryable<Student>().Count();
                throw new Exception("error haha");
            });
            asyncResult.Wait();
            var asyncCount = db.Queryable<Student>().Count();

            //有返回值和状态
            var asyncResult2 = db.Ado.UseTranAsync<List<Student>>(() =>
            {
                return db.Queryable<Student>().ToList();
            });
            asyncResult2.Wait();
















收藏到朋友圈: