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