我也谈嵌套事务
我相信数据库事务的问题,每个人都或多或少的使用过.我说句惭愧的话,关于事务嵌套的问题,我一直都没有找到一个满意的解决方案,小弟才疏学浅.但我还是把我的一些想法提出来,以便各位朋友交流和提出科学的方法.已解我心中的痛!
闲话就不多说了,接下来我举个例子。
有三个业务对象,这些对象只是例子,业务逻辑是否合理,不在本文章探讨范围。
1、客户对象(Customer)。对客户基本信息进行管理(登记、修改、删除);
2、预约(DestineBill)。对客户预约单进行管理(登记、修改、删除);
3、帐单(BillManage)。对帐单进行管理。

业务对象

客户#region 客户

/**//// <summary>
/// 客户管理
/// </summary>
public class Customer : BusinessBase

{

/**//// <summary>
/// 客户ID
/// </summary>
private int _ID;

/**//// <summary>
/// 客户名称
/// </summary>
private string _Name = string.Empty;

/**//// <summary>
/// 客户ID
/// </summary>
public int ID

{

get
{ return this._ID; }
}

/**//// <summary>
/// 客户名称
/// </summary>
public string Name

{

set
{ this._Name = value; }

get
{ return this._Name; }
}

/**//// <summary>
/// 构造函数
/// </summary>
public Customer()

{ }

/**//// <summary>
/// 客户登记
/// </summary>
public void Insert()

{
this.CreateDbTransaction();
try

{
//具体操作
this.CommitDbTransaction();
}
catch

{
this.RollbackDbTransaction();
//出错处理
throw;
}
finally

{
this.DisposeDbTransaction();
}

}
}
#endregion


预约单#region 预约单

/**//// <summary>
/// 预约单管理
/// </summary>
public class DestineBill : BusinessBase

{

/**//// <summary>
/// 预约单ID
/// </summary>
private int _ID;

/**//// <summary>
/// 预约备注
/// </summary>
private string _Remark = string.Empty;

/**//// <summary>
/// 预约单ID
/// </summary>
public int ID

{

get
{ return this._ID; }
}

/**//// <summary>
/// 预约备注
/// </summary>
public string Remark

{

set
{ this._Remark = value; }

get
{ return this._Remark; }
}

/**//// <summary>
/// 预约单构造函数
/// </summary>
public DestineBill()

{ }

/**//// <summary>
/// 登记预约单
/// </summary>
public void Insert()

{
this.CreateDbTransaction();
try

{
//具体操作
this.CommitDbTransaction();
}
catch

{
this.RollbackDbTransaction();
//出错处理
throw;
}
finally

{
this.DisposeDbTransaction();
}

}
}
#endregion


帐单#region 帐单

/**//// <summary>
/// 帐单
/// </summary>
public class BillManage : BusinessBase

{

/**//// <summary>
/// 帐单ID
/// </summary>
private int _ID;

/**//// <summary>
/// 帐单金额
/// </summary>
private double _BillMoney = 0;
public int ID

{

get
{ return this._ID; }
}

/**//// <summary>
/// 帐单金额
/// </summary>
public double _BillMoney

{

set
{ this._BillMoney = value; }

get
{ return this._BillMoney; }
}

/**//// <summary>
/// 帐单管理构造函数
/// </summary>
public BillManage()

{ }

/**//// <summary>
/// 登记帐单
/// </summary>
public void Insert()

{
this.CreateDbTransaction();
try

{
//具体操作
this.CommitDbTransaction();

}
catch

{
this.RollbackDbTransaction();
//出错处理
throw;
}
finally

{
this.DisposeDbTransaction();
}

}

}
#endregion
闲话就不多说了,接下来我举个例子。
有三个业务对象,这些对象只是例子,业务逻辑是否合理,不在本文章探讨范围。
1、客户对象(Customer)。对客户基本信息进行管理(登记、修改、删除);
2、预约(DestineBill)。对客户预约单进行管理(登记、修改、删除);
3、帐单(BillManage)。对帐单进行管理。

客户#region 客户
/**//// <summary>
/// 客户管理
/// </summary>
public class Customer : BusinessBase
{
/**//// <summary>
/// 客户ID
/// </summary>
private int _ID;
/**//// <summary>
/// 客户名称
/// </summary>
private string _Name = string.Empty;
/**//// <summary>
/// 客户ID
/// </summary>
public int ID
{
get
{ return this._ID; }
}
/**//// <summary>
/// 客户名称
/// </summary>
public string Name
{
set
{ this._Name = value; }
get
{ return this._Name; }
}
/**//// <summary>
/// 构造函数
/// </summary>
public Customer()
{ }
/**//// <summary>
/// 客户登记
/// </summary>
public void Insert()
{
this.CreateDbTransaction();
try 
{
//具体操作
this.CommitDbTransaction();
}
catch
{
this.RollbackDbTransaction();
//出错处理
throw;
}
finally 
{
this.DisposeDbTransaction();
}
}
}
#endregion

预约单#region 预约单
/**//// <summary>
/// 预约单管理
/// </summary>
public class DestineBill : BusinessBase
{
/**//// <summary>
/// 预约单ID
/// </summary>
private int _ID;
/**//// <summary>
/// 预约备注
/// </summary>
private string _Remark = string.Empty;
/**//// <summary>
/// 预约单ID
/// </summary>
public int ID
{
get
{ return this._ID; }
}
/**//// <summary>
/// 预约备注
/// </summary>
public string Remark
{
set
{ this._Remark = value; }
get
{ return this._Remark; }
}
/**//// <summary>
/// 预约单构造函数
/// </summary>
public DestineBill()
{ }
/**//// <summary>
/// 登记预约单
/// </summary>
public void Insert()
{
this.CreateDbTransaction();
try
{
//具体操作
this.CommitDbTransaction();
}
catch
{
this.RollbackDbTransaction();
//出错处理
throw;
}
finally
{
this.DisposeDbTransaction();
}
}
}
#endregion

帐单#region 帐单
/**//// <summary>
/// 帐单
/// </summary>
public class BillManage : BusinessBase
{
/**//// <summary>
/// 帐单ID
/// </summary>
private int _ID;
/**//// <summary>
/// 帐单金额
/// </summary>
private double _BillMoney = 0;
public int ID
{
get
{ return this._ID; }
}
/**//// <summary>
/// 帐单金额
/// </summary>
public double _BillMoney
{
set
{ this._BillMoney = value; }
get
{ return this._BillMoney; }
}
/**//// <summary>
/// 帐单管理构造函数
/// </summary>
public BillManage()
{ }
/**//// <summary>
/// 登记帐单
/// </summary>
public void Insert()
{
this.CreateDbTransaction();
try
{
//具体操作
this.CommitDbTransaction();
}
catch
{
this.RollbackDbTransaction();
//出错处理
throw;
}
finally
{
this.DisposeDbTransaction();
}
}
}
#endregion他们单独执行时不会有什么问题。这时如果有另一个业务对象的业务包含这3个业务对象的Insert方法,并且在出错需要回滚时该怎么办呢?
这就是我想说的一个问题。
我现在的做法是:在业务对象基类中保存一个事务队列,来判断该事务是否需要提交(该事务是不是外部创建,不是外部创建就可以提交,不是外部创建的事务,该事务不提交)。
这样做了之后,最大的问题是数据库连接会经常超时,某些表会经常被占用(她处于事务中)。我不知道大型系统中一般是怎么来处理这个问题的。
希望大家提出你们宝贵的经验或建议。
