本节为具体的代码,事务管理器类的代码如下:
===================================================
using System;
using System.Data;
using System.Data.OracleClient;
using System.Threading;
using System.Collections;
namespace b2c.DB
{
/// <summary>
/// 事务管理器,支持多个事务的并发。
/// 将对数据库连接及事务的操作进行封装,从而简化了对数据库连接及事务的使用。
/// 此类主要借助名为ThreadStatic的特性,使得各个线程拥有各自的连接,拥有各自的事务。
/// </summary>
public sealed class TransManager
{
//用于存储连接
private static Hashtable connTable = new Hashtable();
[ThreadStatic]
static OracleTransaction trans; //数据库事务
[ThreadStatic]
static bool isBegin; //事务是否开始
private static TransManager transManager = new TransManager();
#region private methods
//将构造函数私有化,从而可以实现singleTon模式。
private TransManager()
{
}
/*
*释放连接
*/
private static void GiveBackConnection()
{
OracleConnection conn = null;
conn = (OracleConnection)connTable[Thread.CurrentThread];
conn.Close();
conn.Dispose();
connTable.Remove(Thread.CurrentThread);
}
#endregion
#region public methods
/// <summary>
/// 获取TransManager的一个实例。
/// </summary>
/// <returns>TransManager的一个实例</returns>
public static TransManager GetInstance()
{
return transManager;
}
/// <summary>
/// 获取一个有效的数据库连接。
/// </summary>
/// <returns>数据库连接</returns>
internal OracleConnection OpenConnection()
{
OracleConnection conn = null;
//如果没有连接,则创建一个连接并加入到集合中
if (connTable.Contains(Thread.CurrentThread))
{
conn = (OracleConnection)connTable[Thread.CurrentThread];
}
else
{
conn = ConnManager.GetInstance().GetConnection();
conn.Open();
connTable.Add(Thread.CurrentThread, conn);
}
return conn;
}
/// <summary>
/// 关闭库数据库连接。
/// </summary>
internal void CloseConnection()
{
//如果当前不存事务中,则直接返还连接
if (!isBegin)
{
//释放连接
GiveBackConnection();
}
}
/// <summary>
/// 开始数据库事务。
/// </summary>
/// <param name="isolateLevel">事务隔离级别</param>
public void BeginTransaction(IsolationLevel isolateLevel)
{
OracleConnection conn = OpenConnection();
//如果不在事务中则开启事务
if (!isBegin)
{
trans = conn.BeginTransaction(isolateLevel);
}
//标识事务开始
isBegin = true;
}
/// <summary>
/// 开始数据库事务(使用默认的隔离级别)。
/// </summary>
public void BeginTransaction()
{
this.BeginTransaction(IsolationLevel.ReadCommitted);
}
/// <summary>
/// 提交数据库事务。
/// </summary>
public void CommitTransaction()
{
//提交后释放
trans.Commit();
trans.Dispose();
//释放连接
GiveBackConnection();
//标志事务已经结束
isBegin = false;
}
/// <summary>
/// 回滚数据库事务。
/// </summary>
public void RollBackTransaction()
{
//提交后释放
trans.Rollback();
trans.Dispose();
//释放连接
GiveBackConnection();
//标志事务已经结束
isBegin = false;
}
/// <summary>
/// 取得当前事务,如果不存在,则返回null。
/// </summary>
/// <returns>数据库事务</returns>
public OracleTransaction GetTransaction()
{
return trans;
}
#endregion
}
}