ado.net统一事务,及连接池管理(三)

 本节为具体的代码,事务管理器类的代码如下:

===================================================

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
 }
}

 

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值