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