假设在TestApp类有个MyMethod()
则:// -----------------------------------------------------------------
// TestApp.cs
// Generate a Strong name:
// sn -k TestApp.snk
// Compile the code:
// csc /target:exe /r:System.EnterpriseServices.dll TestApp.cs
// Run TestApp:
// start TestApp.exe
// -----------------------------------------------------------------
using System;
using System.Runtime.CompilerServices;
using System.EnterpriseServices;
using System.Reflection;//Registration details.
//COM+ application name as it appears in the COM+ catalog.
[assembly: ApplicationName("TestApp")]
//Strong name for assembly.
[assembly: AssemblyKeyFileAttribute("TestApp.snk")][Transaction(TransactionOption.Required)]
public class Account : ServicedComponent
{
//Provides SetComplete behavior in the absence of exceptions.
[AutoComplete]
public void MyMethod(int amount)
{
// Do some database work. Any exception thrown here aborts the
// transaction; otherwise, transaction commits.
}
}
可以吗?
则:// -----------------------------------------------------------------
// TestApp.cs
// Generate a Strong name:
// sn -k TestApp.snk
// Compile the code:
// csc /target:exe /r:System.EnterpriseServices.dll TestApp.cs
// Run TestApp:
// start TestApp.exe
// -----------------------------------------------------------------
using System;
using System.Runtime.CompilerServices;
using System.EnterpriseServices;
using System.Reflection;//Registration details.
//COM+ application name as it appears in the COM+ catalog.
[assembly: ApplicationName("TestApp")]
//Strong name for assembly.
[assembly: AssemblyKeyFileAttribute("TestApp.snk")][Transaction(TransactionOption.Required)]
public class Account : ServicedComponent
{
//Provides SetComplete behavior in the absence of exceptions.
[AutoComplete]
public void MyMethod(int amount)
{
// Do some database work. Any exception thrown here aborts the
// transaction; otherwise, transaction commits.
}
}
可以吗?
Microsoft.ApplicationBlocks.Data就是这么做的,你可以参考一下。
1)在try外,定义连接和事务;
2)在try里,先启动事务,再调用带事务参数的访问数据库的接口函数,最后提交事务;
3)在catch里,处理各种异常情况;
4)在finally里,结束事务。
IDbConnection conn = null;//定义连接
IDbTransaction trans = null;// 定义事务
try
{
DataAccess.DataAccessHelper.BeginTransaction(out conn, out trans);//开始事务,位于try里面(常为try内首句)
……
……//处理主流程(加入事务处理的子函数均须带有trans参数)
……
trans.Commit();//事务提交,位于try里面(常为try内尾句)
}
catch (DataAccess.DataAccessException)
{
//trans.Rollback();//事务回滚,现在不再必要!!(有也无妨)
……
……//处理异常
……
}
finally
{
DataAccess.DataAccessHelper.EndTransaction(ref conn, ref trans); //结束事务,位于finally里面,不要放入try或catch里面,连接和事务在此释放(未提交未回滚的事务先回滚)。
……
……//处理结尾的流程(不管有没有异常,不管有没有return语句,均须执行的流程)
}
使用事务须注意:如某一个数据表在事务中修改数据纪录,查询这个数据表的数据纪录时也须使用带事务参数的查询函数!特别是在循环体中使用事务时须注意这一点!
#region use Transaction,启动事务和结束事务。
/// <summary>
/// 启动新事务。
/// </summary>
/// <returns></returns>
public static void BeginTransaction(out IDbConnection conn, out IDbTransaction trans)
{
try
{
conn = DbConnFactory.instance().request();
trans = conn.BeginTransaction();//psk
}
catch (Exception eh)
{
throw new DataAccessTierException(eh.Message);
}
}
/// <summary>
/// 结束指定事务。
/// </summary>
/// <param name="trans"></param>
public static void EndTransaction(ref IDbConnection conn, ref IDbTransaction trans)
{
if (trans != null)
{
if(trans.Connection != null)//psk
{
trans.Rollback();
}
trans = null;//psk
}
if (conn != null)
{
if(conn.State == System.Data.ConnectionState.Open)
{
conn.Close();
}
conn = null;
}
} #endregion use Transaction,启动事务和结束事务。
你那个看不懂啊,能不能解释一下呀
能不能提供一些链接阿?谢谢阿