-
ADO事务处理方式运行正常
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//// <summary>
/// 执行数据库事务
/// </summary>
/// <param name="dbConnStr">数据库连接串,有多少个连接串就创建多少个事务</param>
/// <param name="routineList">事务代理数组,注意,可能会在一个事务中完成所有工作</param>
public static void DoTransaction(string[] dbConnStr,ITransactionRoutine[] routineList)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
object[] conn = new object[dbConnStr.Length];
object[] trans = new object[dbConnStr.Length];
try
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
for(int i = 0; i < dbConnStr.Length;i++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
SqlConnection connItem = new SqlConnection(dbConnStr[i]);
conn[i] = connItem;
connItem.Open();
trans[i] = connItem.BeginTransaction();
}
for(int i = 0;i < routineList.Length;i++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ITransactionRoutine routine = routineList[i];
routine.Execute((SqlTransaction) trans[routine.TransIndex]);
}
foreach(object obj in trans)
((SqlTransaction)obj).Commit(); //提交所有事务
}
catch(Exception ex)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
foreach(object obj in trans)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
SqlTransaction transItem = (SqlTransaction)obj;
try
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
transItem.Rollback(); //回滚所有事务
}
catch (SqlException e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (transItem.Connection != null)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Console.WriteLine("An exception of type " + e.GetType() +
" was encountered while attempting to roll back the transaction.");
}
throw e;
}
}
throw ex; //最后不要忘记抛出来
}
finally
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
for(int i = 0;i < conn.Length;i++) //释放所有数据库连接
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
SqlConnection connItem = (SqlConnection)conn[i];
if(connItem != null)
connItem.Close();
connItem = null;
}
}
}
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//// <summary>
/// 数据库事务操作接口
/// </summary>
public interface ITransactionRoutine
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 所属的事务编号
/// </summary>
int TransIndex
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get;
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 执行 有异常就会弹出
/// </summary>
/// <param name="trans"></param>
void Execute(SqlTransaction trans);
}
调用方式如下:
//找到初始化站点的配置数据
IConfigurationElement[] pluginsConfigElems = null;
IConfigurationElement[] catalogsConfigElems = null;
IConfigurationElement[] rolesConfigElems = null;
IConfigurationElement[] usersConfigElems = null;
SetupConfigElems(ref pluginsConfigElems,
ref catalogsConfigElems,
ref rolesConfigElems,
ref usersConfigElems);
![](/Images/OutliningIndicators/None.gif)
//第一步 创建站点数据
DBTrans.ITransactionRoutine routineSaveSiteInDB = new RoutineSaveSiteInDB(m_siteMgr, m_site);
![](/Images/OutliningIndicators/None.gif)
//第二步 创建默认的分配模块
DBTrans.ITransactionRoutine routineAssignPlugins =
new RoutineAssignPlugins(m_site, pluginsConfigElems);
![](/Images/OutliningIndicators/None.gif)
//第三步 创建固定的应用目录
DBTrans.ITransactionRoutine routineCreateCatalogs =
new RoutineCreateCatalogs(m_site, catalogsConfigElems);
![](/Images/OutliningIndicators/None.gif)
//第四步 创建固定的角色,创建固定的用户,并分配到角色中,并且给角色分配目录权限
DBTrans.ITransactionRoutine routineCreateRoles =
new RoutineCreateRoles(m_site, rolesConfigElems, usersConfigElems);
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
DBTrans.ITransactionRoutine[] routineList =
{
routineSaveSiteInDB,
routineAssignPlugins,
routineCreateCatalogs,
routineCreateRoles
};
![](/Images/OutliningIndicators/None.gif)
try
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
DBTrans.DoTransaction(new string[]
{dbConn},routineList);
}
catch (ApplicationException ex)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
result.Success = false;
result.KernelMessage = ex.InnerException.Message;
}
return result;
-
相关阅读:
WebRTC视频采集中的约束有哪些和具体的使用方法
解决WebRTC中不同的浏览器之间适配的问题
WebRTC如何获取音频视频设备
用C#调用外部DLL
null值与非null只比较大小时,只会返回false
jsonp实现js跨域请求
同一域名的ASP.NET网站实现Session共享
machinekey相关信息
从bbs.3dmgame.com与qq的登录解析oauth2.0协议
asp.net使用wsdl文件调用接口,以及调用SSL接口报错“根据验证过程 远程证书无效”的处理
-
原文地址:https://www.cnblogs.com/xiaotaoliang/p/440751.html
Copyright © 2020-2023
润新知