首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

再问下三层中的事务有关问题

2012-04-07 
再问下三层中的事务问题?在三层中,我想大家也应该有碰到在业务层中调用 多个 数据层的方法吧,这时如果要使

再问下三层中的事务问题?
在三层中,我想大家也应该有碰到在业务层中调用 多个 数据层的方法吧,这时如果要使多个方法参与事务的话,大家是怎么做的呢
目前我用的是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();


SqlTransaction trans = conn.BeginTransaction(IsolationLevel.ReadCommitted);

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


[解决办法]
:)
[解决办法]
一方面,我讲了,你可以自己定义各个接口,任何人都不求,更不求TransactionScope,以此来隐藏所谓的技术。

其次,我说到 DbTransaction 是一个抽象类(实际上System.Data.Common中几乎都是),它正是一个逻辑设计工具(当你确定你的数据库事务肯定是其某一种子类实现时)。

我想你太为标题名词而困扰了。难道因为DbTransaction这个名词中有DB二字,难道因为它的dll中有涉及某个数据库的东西,你就不能借用它的抽象定义?

“数据库层方法”中使用的到的东西就是数据库层专有的?这肯定不对吧。数据库层还使用到业务对象呢。
[解决办法]
不要为名词而困扰。既然你看到一个现成的接口或者抽象类正确地抽象了你可能在项目中用到以及即将用到的所有数据库,它就可以用在逻辑层。这是遵照书本上的所谓“三层”的原理来分析得到的,而不是简单地唯书本上的语录为准。设计师的脑筋会稍微转弯的。
[解决办法]
你可以看看DbTransaction的源代码,它跟你在问题中说的逻辑需求说明有多大的出入呢?不妨说明两三点看看。
[解决办法]
up
[解决办法]
呵呵lz小弟,sp1234已经很清楚的诠释了那天我教你的方法.你仔细看一下.体会一下吧.哈哈
[解决办法]
up

热点排行