• 维护受业务事务影响的对象列表,并协调变化的写入和并发问题的解决.
    • 从DB中存取Data时,必须记录增删改动作,以将对DB有影响的数据写会到DB中去.
    • 如果在每次修改对象模型时就对DB进行相应的修改,会造成大量小规模的DB调用,降低了速度.
    • 工作单元记录业务事务中对DB有影响的所有变化.然后在操作结束后,了解所有需要对DB做的改变.
  • 运行机制
    • 如何知道应该记录那些对象.可以由调用者实现,或者让发生变化的对象通知工作单元.

      • caller registration

        • 用户改变了某个对象后,必须将它注册到工作单元.没有注册的对象在提交时都不会写入DB.
        • 允许在内存中改变对象而又不将它写入DB.但是,要达到这样的目的,最好做一个显示的拷贝.
      • object registration
        • 把注册方法置于对象方法(select,set)中.
        • 工作单元要么被传递给对象,要么在一个公共的位置上(通常在某些会话对象上).
      • unit of work controller
        • 工作单元控制所有数据库的读操作.
        • 读操作时,产生一个拷贝.在提交时比较当前对象和拷贝对象.
        • 加重了提交的负担,但使得只更新真正改变了的域,同时避免了在对象域内执行注册调用.
        • 一个折中
          • 只拷贝改变了的对象.
          • 这需要注册.
          • 但是支持有选择的更新.
          • 当读多于写操作时,降低拷贝操作的负担.
    • 工作单元还能在DB使用引用完整性是用来保证更新顺序.
      • 类似地,使用工作单元可以减少死锁的可能性.如果每个事物都按相同的顺序处理需要进行编辑的表,会降低死锁的风险.
    • 对象如何找到当前的工作单元.
      • 用一张线程范围内的注册表.
      • 在方法调用或者创建对象时,将工作单元传递给需要它的对象.
      • 都必须保证访问工作单元的线程不超过一个.
    • 也可以处理批量更新(batch update).
      • 批量更新:把若干SQL命令作为一个单独的单元发送.这样可以在一次单独的远程调用中得到处理.
    • 不仅可以用于数据库.还可以作用于任何事物资源,可以调整消息队列和事务监控.
  • 使用时机
    • 其解决的基本问题

      • 记录操作过的各种对象,以便知道在同步内存和DB的数据时需要考虑哪些对象.
    • 最简单的方法,每次修改对象时就显式地保存该对象.
      • 会造成更多的DB调用.
    • 可以把对DB的更新操作放到最后.这样的话,需要记录已经改变的所有对象.
      • 使用变量来实现记录跟踪.但是变量很多时,会很难以管理.变量与事务脚本配合.
      • 对每个发生了改变的对象打"脏"标志.
        • 其价值取决于寻找所有"脏"对象的难易程度.
    • 工作单元能够把所有的信息保存在一个地方.从而不必再为记录所做的修改做很多操作.

工作单元(Unit of Work)的更多相关文章

  1. ABP理论学习之工作单元(Unit of Work)

    返回总目录 本篇目录 公共连接和事务管理方法 ABP中的连接和事务管理 仓储类 应用服务 工作单元 工作单元详解 关闭工作单元 非事务的工作单元 工作单元方法调用其它 工作单元作用域 自动保存 IRe ...

  2. 基于DDD的.NET开发框架 - ABP工作单元(Unit of Work)

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  3. 【.Net设计模式系列】工作单元(Unit Of Work)模式 ( 二 )

    回顾 在上一篇博客[.Net设计模式系列]仓储(Repository)模式 ( 一 ) 中,通过各位兄台的评论中,可以看出在设计上还有很多的问题,在这里特别感谢 @横竖都溢 @ 浮云飞梦 2位兄台对博 ...

  4. 工作单元 — Unit Of Work

    在进行数据库添加.修改.删除时,为了保证事务的一致性,即操作要么全部成功,要么全部失败.例如银行A.B两个账户的转账业务.一方失败都会导致事务的不完整性,从而事务回滚.而工作单元模式可以跟踪事务,在操 ...

  5. ABP(现代ASP.NET样板开发框架)系列之12、ABP领域层——工作单元(Unit Of work)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之12.ABP领域层——工作单元(Unit Of work) ABP是“ASP.NET Boilerplate Pr ...

  6. ABP领域层——工作单元(Unit Of work)

    ABP领域层——工作单元(Unit Of work) 点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之12.ABP领域层——工作单元(Unit Of work) ...

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

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

  8. ABP领域层知识回顾之---工作单元

    1. 前言   在上一篇博文中(http://www.cnblogs.com/xiyin/p/6842958.html) 我们讲到了ABP领域层的仓储.这边博文我们来讲 工作单元.个人觉得比较重要.文 ...

  9. [.NET领域驱动设计实战系列]专题四:前期准备之工作单元模式(Unit Of Work)

    一.前言 在前一专题中介绍了规约模式的实现,然后在仓储实现中,经常会涉及工作单元模式的实现.然而,在我的网上书店案例中也将引入工作单元模式,所以本专题将详细介绍下该模式,为后面案例的实现做一个铺垫. ...

随机推荐

  1. 深入剖析 HTML5

    作为新一代的 HTML 标准,HTML5 不仅强化了 Web 网页的表现性能,还追加了本地数据库等 Web 应用的功能.虽然 HTML5 标准仍处于完善之中.然而,大部分新版本的浏览器已经能够支持某些 ...

  2. Android 开发中使用Intent传递数据的方法

    Activity之间通过Intent传递值,支持基本数据类型和String对象及 它们的数组对象byte.byte[].char.char[].boolean.boolean[].short.shor ...

  3. 教你用Cocosdx导出安卓安装文件(.apk)(一)

    我也是刚弄出来,过程可能有点混乱和不具体,我尽我所能写完整.各位看官多多包涵 设备环境: 我所用的是mac 10.8.5    64位 Cocosdx-3.0rc2 xcode 5.0 一.准备 ND ...

  4. php调试小技巧

    /** * 用来调试输出结果 * @param type $data * @return type */ function shionyu_debug($data) { ob_start(); var ...

  5. Linux内核高端内存 转

        Linux内核地址映射模型x86 CPU采用了段页式地址映射模型.进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存. 段页式机制如下图.   Linux内核地址空间划分 通 ...

  6. IIS 之 HTTP错误 404.17 - Not Found(请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。)

    问题描述:HTTP 404.17 - Not Found" IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理 .   出现这种情况的原因通常是因为先安装了Framew ...

  7. JavaScript 获取当前时间戳的代码

    avaScript 获取当前时间戳: 第一种方法: 复制代码代码如下: var timestamp = Date.parse(new Date());  结果:1280977330000 第二种方法: ...

  8. (转)Android学习笔记③——常用快捷键

    常用快捷键 代码跳转 描述:跳转是为了方便代码位置的定位,存在两种跳转:在定义处可以跳转到调用处,在调用处可以跳转到定义处. 快捷键:Cmd + 鼠标单击 方法间跳转 描述:从一个类方法跳转到临近的一 ...

  9. 进程控制块的task_struct结构

    >进程控制块 在linux中进程信息存放在叫做进程控制块的数据结构中,每个进程在内核中都有⼀个进程控制块(PCB)来维护进程相关的信息,Linux内核的 进程控制块是task_struct结构体 ...

  10. javascript 编程技巧

    1.巧用判断: 在js中,NaN,undefined,Null,0,"" 在转换为bool的时候,是false,所以,可以这样写. if(!obj) {} 表示一个对象如果为fal ...