1、事务失效原因
1.如果是MySql你要确定你的的表格式设置是否支持事务
2.db对象不是同一个 ,正确用法如下:
var mydb=方法外部的DB对象;
mydb.Insetable(list).ExecuteCommand(); //使用方法内变量mydb
mydb.Queryable().ToList();//使用方法内变量mydb
2、单库事务
事务有3种实现方式,你可以根据你的喜爱实现事务
需要注意db必须是同一个对象,如果db不是同一个对象事务将失效, mysql需要注意表的格式是否支持事务
2.1没有返回值的事务
var result = db.Ado.UseTran(() =>
{
var beginCount = db.Queryable().ToList();
db.Ado.ExecuteCommand("delete student");
var endCount = db.Queryable().Count();
throw new Exception("error haha");
});
if(result.IsSuccess)
{
//result.ErrorMessage
}
2.2有返回值的事务
var result2 = db.Ado.UseTran<List>(() =>
{
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()
{
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().ExecuteCommand();
db.ChangeDatabase("2");//使用库2
db.Deleteable<Order>().ExecuteCommand();
db.CommitTran();
}
catch
{
db.RollbackTran();
}
4、CAP事务
注意:MySql用户使用 sqlSugarCore.MySqlConnector 替换 sqlSugarCore , Cap2.6以上只能用MySqlConnector
1、数据库的自动释放要关闭
2、手动打开数据库连接 db.Ado.Connection.Open();
3、用db.Ado.Connection创建事务
4、把你的事务赋值到ORM对象 db.Ado.Transaction = 你的事务;
5、执行你的代码
6、关闭Connection对象