当前位置:首页 » 《随便一记》 » 正文

SqlSugar 4.数据事务

16 人参与  2022年11月09日 11:22  分类 : 《随便一记》  评论

点击全文阅读


文章目录

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;}

?文档参考:数据事务


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/47624.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1