背景

搞了近五年的系统开发,总是抱着一种思维模式,用户的一个操作对应一个请求和一个事务,比如:用户选择了N条记录,我就会向服务器发生一个请求,服务器在一个事务中进行处理。前几天在群里一个前辈反问:批量操作难道真的要在一个事务中?这个问题让陷入了反思,谢谢前辈们(魏琼东)。

DDD中有聚合的概念,一个聚合有且只有一个聚合根和一些其他实体,如:订单聚合中,订单是聚合根,订单明细是聚合内的实体。因为DDD中只能操作聚合根,这篇文章就介绍聚合根的批量删除问题。有人问聚合内的实体的删除咋弄?聚合内实体的删除必须伴随着聚合根的修改(这里不做详细介绍)。

另外一点是需要注意的是,引入工作单元之后,批量操作和单个操作服务器端的逻辑是不同的,如:索引验证问题和工号生成问题(这里不做详细介绍)。

批量删除思路

我目前有三种选择,我记录下来,然后一个一个分析:

  1. 发送一个请求,服务器一个事务。
  2. 发送一个请求:服务器N个事务。
  3. 发送N个请求,服务器N个事务。

发送一个请求,服务器一个事务。

这是我之前采用的思路,现在觉得非常不好,为什么非要在一个事务中呢?如果您觉得非要在一个事务中,就告诉我一声。

发送一个请求:服务器N个事务。

这种思路可以接受,不过要在服务器端做额外的处理,如:收集哪些失败或成功的信息,发生给客户端,如果我不用AJAX,我就会选择这个方案。

发送N个请求,服务器N个事务。

考虑到我是AJAX编程,这种思路好,重分利用了客户端。

发送N个请求,服务器N个事务的实现思路

思路有了,实现就不是问题了,搞个队列排队发送请求就行了,当然你可以选择并行发送请求或分批次排队发送请求。

删除的客户端逻辑

 1 /**
 2  * 删除功能。
 3  *
 4  * @class Delete
 5  * @extends Happy.action.Action
 6  * @namespace Happy.table.action
 7  */
 8 Ext.define('Happy.table.action.Delete', {
 9     extend: 'Happy.action.Action',
10     requires: [
11         'Happy.server.PessimisticLockProxy',
12         'Happy.Msg',
13         'Happy.Ajax'
14     ],
15
16     DELETE_CONFIRM_TITLE: '删除确认',
17     DELETE_CONFIRM_MSG: '确定执行删除吗?',
18
19     defaultConfig: {
20         itemId: 'delete',
21         iconCls: 'delete-button',
22         text: '删除',
23         disabled: true,
24         autoEnableAndDisable: true
25     },
26
27     /**
28      * 契约:<br/>
29      * <ul>
30      *  <li>button.up('tablepanel')!==null。</li>
31      * </ul>
32      * @protect
33      * @method onClickHandler
34      * @param {Ext.button.Button} button 按钮
35      */
36     onClickHandler: function (button) {
37         var me = this;
38
39         var table = button.up('tablepanel');
40         var records = table.getSelection();
41
42         if (records.length == 0) {
43             return;
44         }
45
46         Ext.Msg.confirm(me.DELETE_CONFIRM_TITLE, me.DELETE_CONFIRM_MSG, function (btn) {
47             if (btn !== 'yes') {
48                 return;
49             }
50
51             me.deleteRecords(records);
52         });
53     },
54
55     /**
56      * private
57      * @method deleteRecords
58      */
59     deleteRecords: function (records) {
60         var me = this;
61
62         if (records.length == 0) {
63             Happy.Msg.showDeleteSuccess();
64             return;
65         }
66
67         Happy.Ajax.destroy(records.shift(), {
68             success: function (record) {
69                 me.deleteRecords(records);
70             },
71             failure: function (record, operation) {
72                 Happy.Msg.showDeleteFailure(operation.error);
73             }
74         });
75     }
76 });

删除的服务器端逻辑

 1         /// <summary>
 2         /// 删除。
 3         /// </summary>
 4         public ActionResult Delete(TAggregateRoot item)
 5         {
 6             this.CurrentCommandService.Execute(new TDeleteCommand
 7             {
 8                 Aggregate = item
 9             });
10
11             return this.NewtonsoftJson(new
12             {
13                 success = true
14             });
15         }

效果图

备注

这里只是演示了批量删除,有很多针对聚合根的批量操作都可以这么处理。

DDD:聚合根的批量删除是不是可以批量发送请求相关推荐

  1. PHP批量删除报错,批量删除的PHP

    第一个页面shanchu.php 无标题文档 批量删除 代号 名称 $db = new MySQLi("localhost","root","root ...

  2. element table批量删除_element ui 批量删除

    //这里做一个事件 checkbox发生改变时触发 修改 删除 data{ return { multipleSelection: [] //返回的是选中的列的数组集合 这里接收用户选中的id 默认放 ...

  3. 电脑微博批量删除-2023怎么批量删除微博网页版代码

    微博怎么快速批量删除_微博怎么把删除所有微博 你可以用它来批量删除微博.微博批量删除收藏和微博批量删除点赞内容,避免别人挖坟. 「2023批量删除微博工具」批量删除微博代码_手机暂时不能批量删除微博 ...

  4. DDD 聚合根 限界上下文

    案例 微信账号:手机号 用户A注销微信账号,需要钱包数据.银行卡数据.亲属卡信息,同时被删除 对一个对象修改,会涉及大量关联对象状态的修改. 需要使所有关联对象的状态保持一致 Aggregate 聚合 ...

  5. php 批量删除cookie,php批量删除cookie的简单实现方法

    php批量删除cookie的简单实现方法 本文实例讲述了php批量删除cookie的简单实现方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: //删除单个cookie:键值设置为空 ...

  6. python批量删除注释_批量删除C和C++注释

    使用Python语言 ,实现批量删除C/C++类型注释 1.目前支持去掉.h .hpp .c .cpp .java 这些以//或/**/为注释符的源文件 2.支持递归遍历目录 3.当前版本为Pytho ...

  7. 批量删除html网页,批量删除.html · panghuamama/Clearly Local - Gitee.com

     批量删除 $axure.utils.getTransparentGifPath = function() { return 'resources/images/transparent.gif'; ...

  8. python批量删除文件名_python批量删除文件名中的未知字符

    python 批量删除文件名中的未知字符 如上图所示, 需要修改的文件名的个数超过 500 个, 如果一个一个的删除非常的费时间, 现 在用 python 修改很容易,方便又省时间,具体步骤如下 1 ...

  9. git批量删除文件和批量提交

    1. 单个删除文件: ① 通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:(可选操作,可直接执行②删除) $ rm test.txt ② 确实要从版本库中删除该文件,那就用命令git rm ...

最新文章

  1. 高性能Linux服务器运维实战,《高性能Linux服务器构建实战》笔记
  2. 阿里巴巴数据分析沙龙 杭州站圆满召开
  3. 怎样借助Python爬虫给宝宝起个好名字
  4. 暑期训练日志----2018.8.24
  5. 如何在ROS环境中解码.bag格式数据
  6. c语言 电阻器的分类,电阻器的详细介绍与分类以及其应用
  7. 基于组件开发——应用软件开发的革命
  8. OpenLayers3基础教程——OL3 介绍control
  9. 广州 人才引进,家属随迁(有小孩),自己房产,外省户口,复核所需资料
  10. Tomcat过时了?别多想,很多公司还是在用的。这份Tomcat架构详解,真的颠覆你的认知
  11. Elementui NavMenu 导航菜单使用
  12. RK3399 io操作GPIO
  13. java -jar xx.jar是如何运行的
  14. 初学者深度学习工作站配置
  15. 遇到的Exception/error及解决办法记录汇总
  16. matlab中冒号的用法
  17. 联想rd650管理口地址_MegaRAID Storage Manager RAID管理工具基本操作
  18. java隐藏手机号、邮箱、身份证部分数字内容
  19. EMD与LMD分解算法结合并SVM
  20. 【Cadence 17.4电路设计与仿真笔记】02-元件库维护及原理图设计

热门文章

  1. python图片分析中央气象台降水_Python气象绘图教程(十)
  2. 阿里组织变革:设立六大业务集团,成熟一个,上市一个;微软软件工程师最高年薪28.8万美元;iOS 16.4 发布|极客头条
  3. SlickEdit V21 2016 破解教程,win linux mac
  4. JAVA代码实现Excel下载,中文名称乱码问题
  5. 数字图像处理——车牌识别(matlab)
  6. Excel日常办公函数
  7. 如何使用OpenDRIVE
  8. SqlServer 查看表结构
  9. 用Python打开视频文件
  10. 实践API钩子拦截DLL库调用