关于事务处理

越过越咸 2009-04-10 02:03:03
本人一直有一个问题困扰很久
由于我一直是三层结构开发
请问大家 事务到底是在DAO层处理? 还是业务层 ?还是两层都要处理 ?
请大家支招 一起研究 呵呵?
...全文
133 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
越过越咸 2009-10-06
  • 打赏
  • 举报
回复
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档 </title>
<style type="text/css">
*{
margin: 0px;
padding: 0px;
}
#div1{
width: 300px;
background-color: yellow;
margin: 5px;
}
#div1:after{
content:'\0020';display:block;height:0;clear:both;
}
.div2{
float: left;
width: 150px;
background-color: blue;
height: 60px;
margin: 5px;
}
</style>

</head>

<body>
<div id="div1">
<div class="div2"> div 2 float: left </div>
<div class="div2"> div 2 float: left </div>
<div class="div2"> div 2 float: left IE底边边界不能解析 </div>
</div>
</body>
</html>
tan124 2009-08-31
  • 打赏
  • 举报
回复
BLL
privatemiao 2009-07-04
  • 打赏
  • 举报
回复
如果将数据放在 action 的外面,也就是说在调用你的 Action 之前就打开,在离开你的 Action 在关闭,这样所以的请求都在事务里了,也就不用再关心事务了,因为所以的都是事务,也不需要每次都掉事务了,
不过性能上可能会有些损失就是了。
mousefog 2009-06-29
  • 打赏
  • 举报
回复
dddddddd
越过越咸 2009-05-21
  • 打赏
  • 举报
回复
page.rar
tddw 2009-05-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mimijidi 的回复:]
@tddw
兄弟,不要调胃口,你把你的方案说详细点,在逻辑层中要怎么使用IDATABASE接口开启,提交,回滚事务
[/Quote]

一小段代码示例

// 示例:新增用户
public void add(Entity _users)
{
// 创建数据库操作接口
QuickData.IDataBase _IDB = QuickData.Data.Create("/Config/DataMap.xml");

// 开启数据库
_IDB.OpenConnection();

// 开启事务
_IDB.OpenTranscation();

try{

// 新增用户
_IDB.add<Entity>(_users);

// 新增日志
_IDB.add<LogEntity>(test);

// 其他操作等等

// 提交事务
_IDB.Commit();
}
catch(Exception _ex)
{
// 回滚事务
_IDB.RollBack();
throw new Exception(_ex.Message);
}
finally{
// 关闭数据库
_IDB.CloseConnection();
}

}
tddw 2009-05-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mimijidi 的回复:]
@tddw
兄弟,不要调胃口,你把你的方案说详细点,在逻辑层中要怎么使用IDATABASE接口开启,提交,回滚事务
[/Quote]

这个讲起来比较麻烦了,因为我现在用的数据持久层是自己写的。
mimijidi 2009-04-26
  • 打赏
  • 举报
回复
@tddw
兄弟,不要调胃口,你把你的方案说详细点,在逻辑层中要怎么使用IDATABASE接口开启,提交,回滚事务
越过越咸 2009-04-21
  • 打赏
  • 举报
回复
楼下的
越过越咸 2009-04-21
  • 打赏
  • 举报
回复
谢谢楼上的
sarsico 2009-04-15
  • 打赏
  • 举报
回复
bll
tddw 2009-04-15
  • 打赏
  • 举报
回复
事务是放在逻辑层的。你用的三层因为是用SqlHelper,所以事务没办法从逻辑层拿出来
而我用的是自己写的数据持久层,所以可以事务可以放逻辑层,给你看下我写的数据持久层的接口
其中 OpenTranscation(); Commit();RollBack();就是分别在逻辑层中开启,提交,回滚事务的方法。


/*
* 数据持久层 QuickData
* Create By Tellov 2008-12-19
*/
namespace QuickData
{
/// <summary>
/// 数据库操作接口
/// </summary>
public interface IDATABASE
{
/// <summary>
/// 打开数据库连接
/// </summary>
void OpenConnection();

/// <summary>
/// 关闭数据库连接
/// </summary>
void CloseConnection();

/// <summary>
/// 开启事务
/// </summary>
void OpenTranscation();

/// <summary>
/// 提交事务
/// </summary>
void Commit();

/// <summary>
/// 回滚事务
/// </summary>
void RollBack();

/// <summary>
/// 新增一条记录
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="_obj">数据实体</param>
/// <returns></returns>
int Add<T>(T _obj);

/// <summary>
/// 更新一条记录
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="_obj">数据实体</param>
/// <returns></returns>
int update<T>(T _obj);

/// <summary>
/// 根据条件批量更新记录
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="_setValue">set语句(不包含set前缀)</param>
/// <param name="_queryString">条件语句(不包含where前缀)</param>
/// <returns></returns>
int update<T>(string _setValue, string _queryString);

/// <summary>
/// 根据条件删除记录
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="_querySql">条件语句(不包含where前缀)</param>
/// <returns></returns>
int delete<T>(string _querySql);

/// <summary>
/// 获取统计的行数
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="_querySql">条件语句(不包含where前缀)</param>
/// <returns></returns>
int Count<T>(string _querySql);

/// <summary>
/// 判断指定记录是否存在
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="_querySql">条件语句(不包含where前缀)</param>
/// <returns></returns>
bool Exists<T>(string _querySql);

/// <summary>
/// 获取指定的一条记录
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="_querySql">条件语句(不包含where前缀)</param>
/// <returns></returns>
T GetEntity<T>(string _querySql)
where T : new();

/// <summary>
/// 根据查询条件和指定排序返回数据列表
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="_querySql">条件语句(不包含where前缀)</param>
/// <param name="_orderSql">排序语句(不包含order by前缀)</param>
/// <returns></returns>
List<T> GetList<T>(string _querySql, string _orderSql)
where T : new();

/// <summary>
/// 根据查询条件和指定排序返回指定条数的数据列表
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="_top">返回的条数</param>
/// <param name="_querySql">条件语句(不包含where前缀)</param>
/// <param name="_orderSql">排序语句(不包含order by前缀)</param>
/// <returns></returns>
List<T> GetList<T>(Nullable<int> _top, string _querySql, string _orderSql)
where T : new();

/// <summary>
/// 根据查询条件和指定排序返回指定的分页数据列表
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="_querySql">条件语句(不包含where前缀)</param>
/// <param name="_orderSql">排序语句(不包含order by前缀)</param>
/// <param name="_CurrentPage">第几页</param>
/// <param name="_pageSize">每页记录数</param>
/// <param name="_rowsCount">ref 总记录数</param>
/// <param name="_pageCount">ref 总页数</param>
/// <returns></returns>
List<T> GetList<T>(string _querySql, string _orderSql, int _CurrentPage, int _pageSize, ref int _rowsCount, ref int _pageCount)
where T : new();

/// <summary>
/// 获取格式化后的select语句
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="_top">select 语句中的 top 值</param>
/// <param name="_fieldNames">字段列表</param>
/// <param name="_querySql">查询条件,无需带where</param>
/// <param name="_orderSql">排序条件,无需带order by</param>
/// <returns></returns>
string SelectSql<T>(Nullable<int> _top, string _fieldNames, string _querySql, string _orderSql);

/// <summary>
/// 执行自定义方法
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="functionName">方法名称</param>
/// <param name="_parms">参数</param>
/// <returns></returns>
object CustomMethod<T>(string functionName, params object[] _parms);
}
}

phhtale 2009-04-15
  • 打赏
  • 举报
回复
在业务层实现,如果用到了spring框架,涉及到了两个更新(比如银行转账),那么还必须在applicationContext.xml中配置事务。如有需要,可联系我,我们来一起讨论;
zgynhqf 2009-04-14
  • 打赏
  • 举报
回复
当然是放在BLL了。

比方说注册用户时的事务。
你可能要注册用户表,同时建立别的数据等。而要建立哪些数据,是你的业务逻辑。

怎么放在BLL,那又是另外一回事啦。
越过越咸 2009-04-14
  • 打赏
  • 举报
回复
谢谢 支招 ling技术是3.5的 没有研究
qqshenyunzcz 2009-04-10
  • 打赏
  • 举报
回复
我感觉在业务层把 或者在页面上处理都可以 因为DAo比较独立 不好把几个方法写到一起 而业务逻辑层和页面上才是调用方法处理的地方所以个人这样认为。。。我最近用linq时候那个事物的包导不了 不知道怎么回事 谁教教我

62,267

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧