首页 > 编程 > .NET > 正文

解析ABP框架中的事务处理和工作单元

2024-07-10 12:47:08
字体:
来源:转载
供稿:网友

通用连接和事务管理方法
连接和事务管理是使用数据库的应用程序最重要的概念之一。当你开启一个数据库连接,什么时候开始事务,如何释放连接...诸如此类的。

正如大家都知道的,.Net使用连接池(connection pooling)。因此,创建一个连接实际上是从连接池中取得一个连接,会这么做是因为创建新连接会有成本。如果没有任何连接存在于连接池中,一个新的连接对象会被创建并且添加到连接池中。当你释放连接,它实际上是将这个连接对象送回到连接池。这并不是实际意义上的释放。这个机制是由.Net所提供的。因此,我们应该在使用完之后释放掉连接对象。这就是最佳实践。

在应用程序中,有两个通用的方来创建/释放一个数据库连接:

第一个方法:在Web请求到达的时候,创建一个连接对象。(Application_BeginRequest这个位于global.asax中的事件),使用同一个连接对象来处理所有的数据库操作,并且在请求结束的时候关闭/释放这个连接 (Application_EndRequest事件)。

这是个简易但却没效率的方法,原因:

或许这个Web请求不需要操作数据库,但是连接却会开启。这对于连接池来说是个毫无效率的使用方式。 这可能会让Web请求的运行时间变长,并且数据库操作还会需要一些执行。这也是一种没效率的连接池使用方式。 这对于Web应用来说是可行的。如果你的应用程序是Widnows Service,这可能就无法被实现了。 同样的这是一个使用事务式的数据库操作最佳场景。如果有一个操作发生失败,所有的操作都会回滚。因为事务会锁住数据库中的一些数据列(事件数据表),它必定要是短暂的。

第二个方法: 创建一个连接当需要的时候(只要在使用它之前)并且释放它在使用它之后。这是相当高效的,但是就得乏味而且反复的去进行(创建/释放连接)。

ABP的连接和事务管理
ABP综合上述两个连接管理的方法,并且提供一个简单而且高效的模型。

1.仓储类(Repository classes)

仓储是主要的数据库操作的类。ABP开启了一个数据库连接并且在进入到仓储方法时会启用一个事务。因此,你可以安全地使用连接于仓储方法中。在仓储方法结束后,事务会被提交并且会释放掉连接。假如仓储方法抛出任何异常,事务会被回滚并且释放掉连接。在这个模式中,仓储方法是单元性的(一个工作单元unit of work)。ABP在处理上述那些动作都是全自动的。在这里,有一个简单的仓储:

public class ContentRepository : NhRepositoryBase<Content>, IContentRepository{  public List<Content> GetActiveContents(string searchCondition)  {    var query = from content in Session.Query<Content>()          where content.IsActive && !content.IsDeleted          select content;    if (string.IsNullOrEmpty(searchCondition))    {      query = query.Where(content => content.Text.Contains(searchCondition));    }    return query.ToList();  }}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表