重要的事情说三遍:
事务只能在同一个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 {9LGEVS(WE_8_6WJG4NO]3L.png](http://www.donet5.com/_theme/ueditor/utf8-net/net/upload/image/20170613/6363296064718603054094892.png)
正确写法
var db=GetAll(); //GetAll是获取新的Db实例的方法 db.Ado.SqlQuery<T>(sql)
跨类事务方案
http://www.donet5.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.donet5.com/Doc/8/1174
2016 © donet5.comApache Licence 2.0