事务

1、事务失效原因

1.如果是MySql你要确定你的的表格式设置是否支持事务

2.db对象不是同一个  ,正确用法如下:

var mydb=方法外部的DB对象;
mydb.Insetable(list).ExecuteCommand();  //使用方法内变量mydb
mydb.Queryable<T>().ToList();//使用方法内变量mydb


2、单库事务

事务有3种实现方式,你可以根据你的喜爱实现事务

需要注意db必须是同一个对象,如果db不是同一个对象事务将失效, mysql需要注意表的格式是否支持事务

2.1没有返回值的事务

 var result = db.Ado.UseTran(() =>
                  {
                    var beginCount = db.Queryable<Student>().ToList();
                    db.Ado.ExecuteCommand("delete student");
                    var endCount = db.Queryable<Student>().Count();
                    throw new Exception("error haha");
                  });
 if(result.IsSuccess)
 {
   //result.ErrorMessage
 }


2.2有返回值的事务

var result2 = db.Ado.UseTran<List<Student>>(() =>

                   {
                     return db.Queryable<Student>().ToList();
                   });
 if (result2.IsSuccess)
 {
  var list= result2.Data;
 }


2.3使用try的方式实现事务

 try
 {
     db.Ado.BeginTran();
     db.Ado.CommitTran();
 }
 catch (Exception)
 {
     db.Ado.RollbackTran();
      throw;
 }


3、多库事务

SqlSugarClient db = new SqlSugarClient(new List<ConnectionConfig>()
{
    new ConnectionConfig(){ ConfigId="1", DbType=DbType.SqlServer, 
    ConnectionString=Config.ConnectionString,InitKeyType=InitKeyType.Attribute,IsAutoCloseConnection=true },
    new ConnectionConfig(){ ConfigId="2", DbType=DbType.MySql, 
    ConnectionString=Config.ConnectionString4 ,InitKeyType=InitKeyType.Attribute ,IsAutoCloseConnection=true}
});

//库1
try
{
    db.BeginTran();
    db.Deleteable<Order>().ExecuteCommand();
   
    db.ChangeDatabase("2");//使用库2
    db.Deleteable<Order>().ExecuteCommand();
    

    db.CommitTran();
}
catch
{
    db.RollbackTran();
}



4、CAP事务

1、数据库的自动释放要关闭


2、手动打开数据库连接 db.Ado.Connection.Open();


3、把你的事务赋值到ORM对象  db.Ado.Transaction = 你的事务;


4、执行你的代码


5、关闭Connection对象