重要的事情说三遍:
    事务只能在同一个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对象
    Sqlsugar4.0事务处理 - 图1
    正确写法

    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();

    和EF一样的事务用法
    http://www.codeisbug.com/Doc/8/1174