public bool ExecuteSqlsWithTransaction(string[] cmdTexts, Func<bool>[] funcs)
{
if (cmdTexts.Length == 0)
{
return false;
}
using (MySqlConnection connection = new MySqlConnection(connStr))
{
connection.Open();
MySqlTransaction trans = connection.BeginTransaction();
foreach (var sql in cmdTexts)
{
using (MySqlCommand cmd = new MySqlCommand(sql, connection, trans))
{
try
{
LoggerManager.Info(string.Format("执行SQL:{0}", sql));
int rows = cmd.ExecuteNonQuery();
if (rows != 1)
{
trans.Rollback();
LoggerManager.Error("批量执行sql语句失败,事务回滚", null);
return false;
}
LoggerManager.Info(string.Format("影响行数为:{0}", rows));
}
catch (Exception ex)
{
trans.Rollback();
LoggerManager.Error("批量执行sql语句失败,事务回滚", ex);
throw;
}
}
}
if (funcs != null)
{
foreach (Func<bool> func in funcs)
{
//执行方法失败,回滚事务
if (!func())
{
trans.Rollback();
LoggerManager.Error(string.Format("批量执行{0}操作失败,事务回滚", func.Method.Name), null);
return false;
}
}
}
trans.Commit();
LoggerManager.Info("批量执行sql语句成功,事务提交");
return true;
}
}
上面我写的这个方法只能执行没有参数的方法,如果有参数呢?我知道可以 Func<int,bool>[] funcs 可是如果参数数量和类型都不确定呢?我想写个通用的这种方法
1.先开始事务
2.执行SQL
3.移动文件夹。
4-1.如果移动文件夹失败则事务回滚
4-2.如果移动文件夹成功则事务提交
5.如果事务提交失败则还原文件夹移动
Func<int,object> or Func<int,<T>>;
如果成功这执行移动文件夹;如果移动文件夹失败想办法恢复就行了
我想移文件夹失败就回滚SQL啊
@Dellienware: 把移动文件移到一个class中来,让这个class实现IEnlistmentNotification接口,实现其Prepare,Commit,Rollback,InDoubt方法。暴露移动文件的方法出来。最后实现类似下面
using(var ts=new TransactionScope())
{
var yourFileManger=....;
yourFileManager.MoveFiles();
//..your db operations;
ts.Complete();
}
文件操作不支持事务。
移动失败就回滚。
关键是,你可以把移动文件写到transaction里面,失败才能回滚,成功则在transaction最后面提交。失败可以抛异常,在catch里回滚,或者用if判断进行回滚都可以