日期:2014-05-18  浏览次数:20421 次

再问下三层中的事务问题?
在三层中,我想大家也应该有碰到在业务层中调用 多个 数据层的方法吧,这时如果要使多个方法参与事务的话,大家是怎么做的呢
目前我用的是TransactionScope,但是有很多问题,想换种方法,
大家给点意见

------解决方案--------------------
帮顶 jf
------解决方案--------------------
我用的是”SqlTransaction“,你用的那个东西确实有很多问题
------解决方案--------------------
我的部分代码,你看看,我用的没事

sqlTrans = SqlHelper.GetSqlTransaction();

if (SqlHelper.ExecuteNonQuery(sqlTrans, CommandType.Text, strBasicInfoSql, smpBasicInfo) > 0)
{
if (SqlHelper.ExecuteNonQuery(sqlTrans, CommandType.Text, insertBillInfoSql, billInfo) > 0)
{
if (SqlHelper.ExecuteNonQuery(sqlTrans, CommandType.Text, insertDetailInfoSql, detailInfo) > 0)
{
sqlTrans.Commit();
}
else
{
sqlTrans.Rollback();

------解决方案--------------------
事务:
1.在存储过程中控制事务——这个是最简单、高效的方法
2.使用ADO.NET Transaction——如果你没使用存储过程(而是把SQL代码写在DAL层),并且事务是同一个数据库链接,可以使用此方法
3.TransactionScope——在业务层把多个DAL方法组成一个事务,且可以自动跨数据库链接。如果事务跨多个数据库链接这个应该是目前最好的办法。
------解决方案--------------------
SqlConnection conn = new SqlConnection(SqlHelper.ConnectionStringProfile);
conn.Open();
SqlTransaction trans = conn.BeginTransaction(IsolationLevel.ReadCommitted);

try
{
SqlHelper.ExecuteNonQuery(trans, CommandType.Text, sqlDelete, param);
SqlHelper.ExecuteNonQuery(trans, CommandType.Text, sqlInsert, parms);
trans.Commit();
}
catch (Exception e)
{
trans.Rollback();
throw new ApplicationException(e.Message);
}
finally
{
conn.Close();
}
------解决方案--------------------
引用楼主 liubiaocai 的帖子:
在三层中,我想大家也应该有碰到在业务层中调用 多个 数据层的方法吧,这时如果要使多个方法参与事务的话,大家是怎么做的呢
目前我用的是TransactionScope,但是有很多问题,想换种方法,
大家给点意见

------解决方案--------------------
使用 DbTransaction 时使用 SqlTransaction,在高层要隐藏具体的数据库实现。

由于我除了ADO.NET以为还要使用许多别的数据库api来操作不同的数据库,他们没有兼容性,因此我自己定义了一个接口,这个接口有Commit和Rollback方法,仅此而已。然后自己实现一个数据库api,其中数据的Connection本身就同时实现这个接口。每一个针对具体数据库的实现都在底层使用它的事务机制来实现这个接口,例如使用DbTransaction来实现这个接口。其实写一个数据库层api,只要实现非常有限的7、8个方法就可以了,远比ado.net看起来简单好用,你可以用这个层把ado.net技术都隐藏起来。
------解决方案--------------------
使用 DbTransaction 时使用 SqlTransaction --> 使用 DbTransaction 而不是使用 SqlTransaction
------解决方案--------------------
探讨
SqlConnection conn = new SqlConnection(SqlHelper.ConnectionStringProfile);
conn.Open();
SqlTransaction trans = conn.BeginTransaction(IsolationLevel.ReadCommitted);

try
{
SqlHelper.ExecuteNonQuery(trans, CommandType.Text, sqlDelete, param);
SqlHelper.ExecuteNonQuery(trans, CommandType.Text, sqlInsert, pa…

------解决方案--------------------
探讨
引用:
SqlConnection conn = new SqlConnection(SqlHelper.ConnectionStringProfile);
conn.Open();