文章目录
1.单库事务2.多租户事务(可跨库)3.调试事务4.语法糖4.1 语法糖一4.2 语法糖二 5.跨方法事务6.CAP事务7.异步事务7.1 用法一7.2 用法二 8.设置事务隔离级别8.1 单库模式用法8.2 多租户模式MySql注意事项:
MYSQL不支持创建表和删除表处理事务,原生事务也一样MyISAM 存储引擎不支持事务 需要改成 InnoDB
1.单库事务
单库事务是针一个db操作执行的事务,无论是 ISqlSugarClient和 SqlSugarClient 用法都一样 static void Main(string[] args) { var db = Sugar.GetInstance(); try { db.Ado.BeginTran(); db.Insertable(new Student() { Id = "1", Name ="hpf", SchoolId = 1 }).ExecuteCommand(); throw new Exception(); //手动抛出异常,回滚Sql db.Ado.CommitTran(); } catch (Exception ex) { db.Ado.RollbackTran(); } Console.ReadLine(); }
如果一个db就一个库,那么你也可以用多租户事务节约代码,因为2者在一个库的情况下作用一样 db.BeginTran(); //去掉了.adodb.CommitTran(); //去掉了.adodb.RollbackTran(); //去掉了.ado
2.多租户事务(可跨库)
目前还没有学习多租户有关知识
3.调试事务
db.ContextId从事务开始、CURD、事务结束
必须一致 这个事务才会生效,如果是MYSQL也检查一下表引擎是否支持事务SqlsugarClient 可以用变量 var db=外部Db; 所有操作使用db保证一致SqlsuagrScope (该对象是线程安全对象,可以单例)可以用单例模式保证一致 项目运行起来的时候,在监视中手动输入 db.ContextId ,以便监控值是否保持不变
4.语法糖
特定语法,方便实用
4.1 语法糖一
这种适合全局异常,直接出错扔出并且回滚
这种方式我没测试过
using (var tran = db.UseTran()) { //业务代码 //里面禁止写 try处理事务逻辑,格式一定按现在的风格来 tran.CommitTran(); } //要写 try处理异常可以写在外面
4.2 语法糖二
这种适合没有异常处理的,减少了try 处理
static void Main(string[] args) { var db = Sugar.GetInstance(); var result = db.UseTran(() => { db.Insertable(new Student() { Id = "2", Name = "hpf", SchoolId= 2 }).ExecuteCommand(); //throw new Exception(); //手动抛出异常,测试事务回滚功能 return true; }); if (result.Data == false) { if (result.IsSuccess == false) Console.WriteLine("事务提交失败"); } else Console.WriteLine("事务提交完成"); Console.ReadLine(); }
5.跨方法事务
目前还没有用到有关知识
6.CAP事务
目前还没有用到有关知识
7.异步事务
请不要在同步方法里面写下面方代码,必须是异步方法才行 返回是要带有Task async
7.1 用法一
static async Task Main(string[] args) { var db = Sugar.GetInstance(); try { db.BeginTran(); await db.Insertable(new Student() { StudentId=13, Name="qwe"}).ExecuteCommandAsync(); //throw new Exception(); //手动抛出异常,测试事务回滚功能 db.CommitTran(); } catch (Exception) { db.RollbackTran(); } Console.ReadLine(); }
7.2 用法二
注意:
await db.UseTranAsync 前面的await不要漏掉了
public class Program { static async Task Main(string[] args) { var db = Sugar.GetInstance(); await Test(db); Console.ReadLine(); } public static async Task Test(SqlSugarClient db) { //异步事务 var result = await db.UseTranAsync(async () => { await db.Insertable(new Student() { Id = "6", Name = "hpf",SchoolId = 2 }).ExecuteCommandAsync(); //throw new Exception(); //手动模拟抛异常 }); if (result.Data==false) //返回值为false { if (result.IsSuccess == true) Console.WriteLine("添加成功"); else Console.WriteLine("添加失败"); throw result.ErrorException; } } }
8.设置事务隔离级别
目前还没有用到有关知识
?文档参考:数据库的事务隔离级别
8.1 单库模式用法
try{ db.Ado.BeginTran(IsolationLevel.ReadCommitted); //业务代码 db.Ado.CommitTran();}catch (Exception ex){ db.RollbackTran(); throw ex;}
8.2 多租户模式
var mysqlDb = db.GetConnection("mysql"); var mssqlDb = db.GetConnection("mssql"); try { mysqlDb.Ado.BeginTran(IsolationLevel.ReadCommitted);//开启库1的事务 mssqlDb.Ado.BeginTran(IsolationLevel.ReadCommitted);//开启库2的事务 //业务代码 只能用 mysqlDb和 mssqlDb db.CommitTran();//注意不能用db.ado.CommitTran } catch (Exception ex) { db.RollbackTran(); throw ex;}
?文档参考:数据事务