单库事务是针一个db操作执行的事务,无论是ISqlSugarClient和SqlSugarClient用法都一样
try{db.Ado.BeginTran();db.Insertable(newOrder(){.....}).ExecuteCommand();db.Insertable(newOrder(){.....}).ExecuteCommand();db.Ado.CommitTran();}catch(Exceptionex){db.Ado.RollbackTran();throwex;}如果一个db就一个库,那么你也可以用多租户事务节约代码,因为2者在一个库的情况下作用一样
db.BeginTran();//去掉了.adodb.CommitTran();//去掉了.adodb.RollbackTran();//去掉了.ado//ISqlSugarClient接口使用多租户事务看文档2.22、多库事务(可跨库)多数据库事务是SqlSugar独有的功能,稳定比CAP更强(CAP还有一层队列),在单个程序中可以很愉快的使用多库事务
SqlSugarClient或者SqlSugarSope继承于2个接口,代码如下事物
SqlSugarClientdb=newSqlSugarClient(newList
db.Ado.BeginTran//单库db.BeginTran//多库事务db.AsTenant().BeginTran()//多库事务一般是接口ISqlSugarClient使用2.1SqlSugarClient事务因为继承ITenant了可以直接使用(老版本varmysql=db.GetConnection要写在事务外面)
db.AsTenant().BeginTran();//低版本(dbasITenant).BeginTran()db.AsTenant().CommitTran();db.AsTenant().RollbackTran();
db.ContextId要从事务开始,CURD和事务结束必须一致这个事务才会生效,如果是MYSQL也检查一下表引擎是否支持事务
不一致怎么办?
测试代码最好用Insert,因为Update有条件过滤等因素添会添加测试难度,我们用插入来进行测试会比较简单些
try{db.BeginTran();Console.WriteLine(db.Queryable
这种适合有全局异常的,直接出错扔出错并且回滚
using(vartran=db.UseTran()){//业务代码//里面禁止写try处理事务逻辑,格式一定按现在的风格来tran.CommitTran();}//要写try处理异常可以写在外面语法糖2:自动异常这种适合没有异常处理的,减少了try处理
SqlSugarScope单例模式支持跨事务方法
SqlSugarClient需要IOC设置Scoped周期实现
CAP可以支持跨程序间的事务处理(非跨程序事务不建议用,涉及到队列等,在单程序中稳定性肯定不如自带的多租户事务)
注意:MySql用户使用升级到最新
1、数据库的自动释放要关闭
2、手动打开数据库连接db.Ado.Connection.Open();
3、用db.Ado.Connection创建事务
4、把你的事务赋值到ORM对象db.Ado.Transaction=你的事务;
5、执行你的代码
6、关闭Connection对象
备份地址
请不要在同步方法里面写下面方代码,必须是异步方法才行返回是要带有Taskasync
用法1:
try{awaitdb.BeginTranAsync();awaitdb.Insertable(newOrder(){CreateTime=DateTime.Now,CustomId=1,Name="aaa",Price=0}).ExecuteCommandAsync();awaitdb.CommitTranAsync();}catch(Exception){awaitdb.RollbackTranAsync();}用法2:
//只有5.0.3.8支持,老版本请升级使用varres=awaitdb.UseTranAsync(async()=>{awaitdb.Insertable(newOrder(){CreateTime=DateTime.Now,CustomId=1,Name="aaa",Price=0}).ExecuteCommandAsync();returntrue;//返回值会变成res.Data});if(result.Data==false)//返回值为false{//result.Data业务的返回值//如果是上面的逻辑result.Data==true肯定业务成功并且事务成功//if(result.IsSuccess==false)//事务执行了回滚//if(result.IsSuccess==true)//事务提交完成}//注意://awaitdb.UseTranAsync前面的await不要漏掉了
单库模式用法
try{db.Ado.BeginTran(IsolationLevel.ReadCommitted);//业务代码db.Ado.CommitTran();}catch(Exceptionex){db.RollbackTran();throwex;}多租户模式
varmysqlDb=db.GetConnection("mysql");varmssqlDb=db.GetConnection("mssql");try{mysqlDb.Ado.BeginTran(IsolationLevel.ReadCommitted);//开启库1的事务mssqlDb.Ado.BeginTran(IsolationLevel.ReadCommitted);//开启库2的事务//业务代码只能用mysqlDb和mssqlDbdb.CommitTran();//注意不能用db.ado.CommitTran}catch(Exceptionex){db.RollbackTran();throwex;}9、嵌套事务(支持异步)9.1.共享模式有外部事务,内部事务用外部事务(推荐)
通过工作单元实现嵌套事务5.1.2.5-preview03
//db.Ado.IsNoTran()表示事务为null才开启事务using(varuow=db.CreateContext(db.Ado.IsNoTran())){using(varuow2=db.CreateContext(db.Ado.IsNoTran())){uow2.Commit();}uow.Commit();//禁止用db.RollBack工作单元内只要throw会自动回滚}9.2.子事务独立(不推荐)不推荐原因:这种很容易出现坑,比如业务A和业务B都用到了一样的表就会死锁
try{db.BeginTran();//业务..AvarchildDb=db.CopyNew();try{childDb.BeginTran();//...业务BchildDb.Commit();}catch(Exception){childDb.RollbackTran();//数据回滚throw;}db.CommitTran();}catch(Exception){db.RollbackTran();//数据回滚throw;}