[图解]企业应用架构模式2024新译本讲解03-事务脚本+表数据入口

1
00:00:00,570 --> 00:00:06,290
这里先创建一个service的对象

2
00:00:07,000 --> 00:00:12,470
然后调用对象的方法、操作

3
00:00:12,480 --> 00:00:13,750
就是事务脚本

4
00:00:14,700 --> 00:00:15,900
然后参数是1

5
00:00:16,660 --> 00:00:19,490
也就是合同ID 

6
00:00:19,620 --> 00:00:21,170
我们给它打一个断点

7
00:00:21,180 --> 00:00:24,820
我们在这里,这地方好了

8
00:00:25,740 --> 00:00:31,740
前面都是预热的

9
00:00:39,530 --> 00:00:42,040
往下走

10
00:00:43,760 --> 00:00:45,320
然后这里,在这里

11
00:00:45,330 --> 00:00:49,730
然后你看,这里创建数据入口

12
00:00:51,920 --> 00:00:55,390
然后查询,返回数据表

13
00:00:57,150 --> 00:01:05,040
这个查询就是Gateway的一个操作了

14
00:01:05,540 --> 00:01:10,130
它定义了一些SQL语句

15
00:01:11,320 --> 00:01:13,660
你看,Gateway开始定义了SQL语句

16
00:01:14,530 --> 00:01:15,570
SQL字符串

17
00:01:16,180 --> 00:01:20,120
然后这个符号

18
00:01:20,130 --> 00:01:23,000
就相当于存储过程里面

19
00:01:24,400 --> 00:01:26,170
参数的变量的符号

20
00:01:27,280 --> 00:01:28,470
所以这个地方

21
00:01:29,890 --> 00:01:31,710
应该放在存储过程里面更合适

22
00:01:31,720 --> 00:01:35,010
周围都是C#的语法

23
00:01:35,020 --> 00:01:36,530
这里你看,插一个字符串

24
00:01:37,350 --> 00:01:38,220
还不如怎么样

25
00:01:38,230 --> 00:01:41,710
直接把这个放到数据库那边

26
00:01:42,410 --> 00:01:44,910
作为存储过程,你这里调用

27
00:01:45,390 --> 00:01:49,240
你调用存储过程那个名字就可以了

28
00:01:49,250 --> 00:01:49,720


29
00:01:49,890 --> 00:01:51,200
参数这里就不变了

30
00:01:51,210 --> 00:01:53,200
直接加参数一模一样了

31
00:01:53,820 --> 00:01:54,900
没有必要放在这里

32
00:01:58,870 --> 00:02:01,820
但很多人喜欢在C#、Java里面

33
00:02:01,830 --> 00:02:04,550
写SQL语句

34
00:02:04,560 --> 00:02:06,580
那只能写很简单的

35
00:02:07,750 --> 00:02:09,390
一复杂了你就写不了

36
00:02:09,400 --> 00:02:12,410
实际上,你要彻底的事务脚本的话

37
00:02:12,420 --> 00:02:14,170
应该干脆就什么

38
00:02:14,450 --> 00:02:16,000
直接把所有的运算

39
00:02:16,640 --> 00:02:19,580
都放在存储过程里面来做

40
00:02:20,090 --> 00:02:23,750
如果我们的类的结构做得好

41
00:02:24,640 --> 00:02:27,940
它完全可以通过标准的集合运算

42
00:02:28,530 --> 00:02:30,680
很优雅的把这个结果给拿出来

43
00:02:31,880 --> 00:02:34,290
包括你看这里,if什么之类的

44
00:02:34,780 --> 00:02:36,610
后面在哪里,这里

45
00:02:37,730 --> 00:02:39,270
If

46
00:02:40,080 --> 00:02:41,900
这都是硬编码

47
00:02:41,910 --> 00:02:45,940
if类型等于这个,这种都是硬编码

48
00:02:46,630 --> 00:02:48,640
这种应该变成数据值才对的

49
00:02:49,460 --> 00:02:51,610
不应该放在代码里面硬编码

50
00:02:53,190 --> 00:02:55,430
包括像这种,3,都是硬编码

51
00:02:56,710 --> 00:02:57,890
它不应该出现在这里

52
00:02:58,870 --> 00:03:00,850
代码里面出现的应该是概念

53
00:03:01,780 --> 00:03:03,320
不能出现一个硬编码这样

54
00:03:03,560 --> 00:03:04,930
包括这个

55
00:03:05,340 --> 00:03:06,910
这个也是硬编码

56
00:03:08,660 --> 00:03:12,380
直接就是一个值

57
00:03:13,100 --> 00:03:15,690
当然这个案例本身它是比较简单了

58
00:03:15,700 --> 00:03:20,580
但是我们要知道,这里面是有问题的

59
00:03:21,170 --> 00:03:25,350
先定义了一些SQL字符串

60
00:03:28,160 --> 00:03:32,360
然后这里,前面是连接了,建立连接

61
00:03:32,370 --> 00:03:33,760
然后这里把定义好的

62
00:03:34,370 --> 00:03:35,320
SQL的字符串

63
00:03:35,330 --> 00:03:37,320
赋值给Command对象是吧

64
00:03:37,800 --> 00:03:40,560
然后添加参数,来把这个值传给它

65
00:03:41,460 --> 00:03:47,040
1,把参数传给它

66
00:03:48,050 --> 00:03:51,290
然后执行,返回结果

67
00:03:52,330 --> 00:03:54,390
就是一个数据表

68
00:03:54,400 --> 00:04:00,130
DataTable这样一个对象

69
00:04:00,140 --> 00:04:00,690
一个表

70
00:04:02,490 --> 00:04:12,180
这样来,在哪里

71
00:04:24,250 --> 00:04:25,840
你看,这是一个事务脚本(口误)

72
00:04:26,150 --> 00:04:28,310
这个相当于调用另外一个过程

73
00:04:29,350 --> 00:04:31,860
Gateway,不是事务脚本,这是事务脚本

74
00:04:31,870 --> 00:04:35,690
调用了Gateway的查询的方法

75
00:04:36,070 --> 00:04:41,690
就是我们刚才讲的,Gateway里面,这个地方

76
00:04:45,430 --> 00:04:48,330
Gateway里面它包含了命令

77
00:04:48,460 --> 00:04:50,490
选择、查询、插入、更新等等

78
00:04:53,240 --> 00:04:54,990
你看,这里有一个

79
00:05:02,750 --> 00:05:06,600
Money,这是一个自定义的类

80
00:05:07,750 --> 00:05:08,820
Money定义一个这个

81
00:05:09,110 --> 00:05:14,350
然后你看这里,这个类是按照企业应用架构模式

82
00:05:14,360 --> 00:05:15,710
Money模式实现的类

83
00:05:16,160 --> 00:05:17,390
我们来说一下Money

84
00:05:17,400 --> 00:05:18,150


85
00:05:19,610 --> 00:05:21,200
如果类型是

86
00:05:21,950 --> 00:05:27,070
你看,这里是把值取出来了

87
00:05:27,640 --> 00:05:28,430
值取出来

88
00:05:32,020 --> 00:05:33,240
往下走

89
00:05:33,730 --> 00:05:38,030
这里你看,有一个

90
00:05:38,040 --> 00:05:43,230
你看这里,allocate这个地方

91
00:05:44,430 --> 00:05:49,000
这个地方相当于把钱分为3份

92
00:05:49,970 --> 00:05:51,750
为什么不能够直接除以3

93
00:05:51,760 --> 00:05:53,960
而是要用Money

94
00:05:56,280 --> 00:05:57,950
类的allocate方法

95
00:05:59,520 --> 00:06:01,310
实际上就是货币的问题了

96
00:06:01,870 --> 00:06:03,010
所以我们要说一下

97
00:06:05,520 --> 00:06:07,730
Fowler的书里面也说了这个问题

98
00:06:09,220 --> 00:06:17,060
这个就是刚才那段代码的类图了

99
00:06:19,510 --> 00:06:24,220
我是用UModel把它逆转过来

100
00:06:25,350 --> 00:06:26,740
用UModel这个工具,你用EA也可以的

101
00:06:27,470 --> 00:06:28,190
用EA也可以

102
00:06:28,200 --> 00:06:34,330
我是用UModel来把它逆向工程得到

103
00:06:34,340 --> 00:06:37,540
你看,有几个常数

104
00:06:39,090 --> 00:06:40,900


105
00:06:40,910 --> 00:06:43,580
这里头列出来,然后有几个方法

106
00:06:45,070 --> 00:06:45,820
这是入口的

107
00:06:47,090 --> 00:06:48,170
然后manager有这个

108
00:06:49,690 --> 00:06:51,420
然后service有这两个方法

109
00:06:52,450 --> 00:06:54,420
这是主程序

110
00:06:58,340 --> 00:07:00,170
UModel还有另外一个好处

111
00:07:02,330 --> 00:07:04,800
就是逆向生成序列图

112
00:07:05,870 --> 00:07:08,070
你看这个层次

113
00:07:08,320 --> 00:07:10,270
后面变量什么它都列出来

114
00:07:10,280 --> 00:07:12,770
因为我层次列得比较深

115
00:07:12,780 --> 00:07:14,090
如果列得浅一点

116
00:07:14,100 --> 00:07:15,630
后面这些就可以不用出现

117
00:07:15,640 --> 00:07:16,730
实际上就两个类

118
00:07:17,610 --> 00:07:18,960
一个是

119
00:07:18,970 --> 00:07:19,720
RecognitionService

120
00:07:21,100 --> 00:07:23,270
这是控制类,或者应用服务类

121
00:07:23,280 --> 00:07:26,370
这是入口类

122
00:07:28,270 --> 00:07:31,340
两个,然后你看,创建一个

123
00:07:31,350 --> 00:07:35,870
然后调用,返回

124
00:07:35,880 --> 00:07:39,580
然后,这里有分支

125
00:07:39,750 --> 00:07:44,360
如果类型是这个,走这个

126
00:07:47,760 --> 00:07:48,390
这是

127
00:07:48,670 --> 00:07:53,000
UModel比EA要好的一个地方

128
00:07:53,010 --> 00:07:55,600
可以帮你分析这个程序的结构

129
00:07:58,160 --> 00:08:00,560
当然如果代码已经写得比较清晰了

130
00:08:00,570 --> 00:08:01,880
你直接看代码也看得出来

131
00:08:06,590 --> 00:08:15,160
Money就是金钱类

132
00:08:16,470 --> 00:08:19,500
金钱包括一个是数额,一个是币种

133
00:08:19,920 --> 00:08:21,020
不能说100 

134
00:08:21,230 --> 00:08:22,820
100什么,100块

135
00:08:24,780 --> 00:08:28,800
还是100卢布

136
00:08:28,810 --> 00:08:32,460
100日元

137
00:08:35,390 --> 00:08:36,220
还是100

138
00:08:37,460 --> 00:08:39,650
印度那边,卢比

1
00:00:00,300 --> 00:00:03,590
所以,涉及到币种

2
00:00:04,150 --> 00:00:04,900
这是一个问题

3
00:00:05,830 --> 00:00:07,290
所以币种就有一个什么

4
00:00:07,300 --> 00:00:11,370
必须运算是在同一个币种

5
00:00:11,380 --> 00:00:14,400
你不能说100美元加100日元

6
00:00:16,600 --> 00:00:19,120
如果你要有个兑换的话

7
00:00:19,130 --> 00:00:20,640
你有一个汇率的问题

8
00:00:22,680 --> 00:00:26,430
另外一个问题就是整数的问题了

9
00:00:27,060 --> 00:00:32,670
因为货币本身它有一个最小的单位

10
00:00:33,400 --> 00:00:37,310
我们人民币是分,最小单位

11
00:00:38,540 --> 00:00:39,570
如果说你这个值

12
00:00:39,580 --> 00:00:41,690
比如说,我有7块钱

13
00:00:43,070 --> 00:00:47,130
我分3份,怎么分

14
00:00:47,140 --> 00:00:48,650
你分,如果得到小数点

15
00:00:50,320 --> 00:00:51,100
这是一个什么

16
00:00:52,270 --> 00:00:53,910
无限的小数

17
00:00:54,600 --> 00:00:56,430
如果说你取整取得不好

18
00:00:56,440 --> 00:01:02,040
你分完之后,你把这三个加起来

19
00:01:03,060 --> 00:01:06,250
结果就少了一分或多了一分

20
00:01:06,870 --> 00:01:07,700
这就麻烦了

21
00:01:08,710 --> 00:01:13,200
像我们当时,我第一个项目就碰到这个问题

22
00:01:14,580 --> 00:01:16,060
我们什么都做好了

23
00:01:16,070 --> 00:01:18,550
然后半夜去上线

24
00:01:20,450 --> 00:01:21,950
上线当天晚上就没有睡

25
00:01:22,240 --> 00:01:25,340
98年的时候,当天晚上就没有睡

26
00:01:26,340 --> 00:01:27,920
然后第二天也没有睡

27
00:01:28,850 --> 00:01:31,870
差不多48个小时才睡觉

28
00:01:33,460 --> 00:01:36,050
就是搞这个,其中一个问题就是

29
00:01:37,260 --> 00:01:39,640
头一天多了一分

30
00:01:40,310 --> 00:01:45,640
第二天又多了两分,这样就很麻烦

31
00:01:45,650 --> 00:01:47,790
后来去查文档

32
00:01:48,010 --> 00:01:50,460
我们刚才之前也讲了

33
00:01:54,960 --> 00:01:59,290
没有什么网络,也没人问看,就是翻看文档

34
00:01:59,840 --> 00:02:04,430
包括SQL Server附带的指南

35
00:02:04,820 --> 00:02:08,240
包括VB的手册等等

36
00:02:10,090 --> 00:02:14,980
后来是我们的领导,高级工程师

37
00:02:14,990 --> 00:02:16,060
当时我们是小兵

38
00:02:18,610 --> 00:02:20,810
很不懈努力去找

39
00:02:21,060 --> 00:02:24,910
终于在一个地方找到问题所在

40
00:02:26,440 --> 00:02:29,120
这个还是非常值得学习的

41
00:02:29,130 --> 00:02:31,750
他坚信自己能够解决

42
00:02:33,110 --> 00:02:37,550
他坚信解决问题的地方就在这个书里面

43
00:02:40,230 --> 00:02:44,350
这个的话,我们很多同学做不到的

44
00:02:44,360 --> 00:02:47,990
有的同学他做题做不对

45
00:02:48,000 --> 00:02:50,190
他来问我,老师,题目是不是有问题

46
00:02:52,130 --> 00:02:53,930
你想想就知道了,这个题目

47
00:02:55,130 --> 00:02:57,530
那么多人做,有问题的话

48
00:02:58,620 --> 00:02:59,600
可能早就改了

49
00:02:59,610 --> 00:03:02,710
第二个,我这个题目出题的时候

50
00:03:03,230 --> 00:03:04,570
那个图画得这么精美

51
00:03:04,580 --> 00:03:06,610
我花那么多心思来画这个图

52
00:03:09,560 --> 00:03:10,350
说明什么

53
00:03:10,360 --> 00:03:12,510
既然这个图画得这么精美

54
00:03:13,210 --> 00:03:14,640
我花了心思画这个图

55
00:03:15,220 --> 00:03:18,690
可能我当时考虑是比较周到的

56
00:03:22,380 --> 00:03:26,590
这个周到,就值得你再去认真,再去思考

57
00:03:26,600 --> 00:03:28,310
再去看书,去思考一下

58
00:03:28,320 --> 00:03:30,150
如果说,我这题目出得很潦草

59
00:03:30,700 --> 00:03:31,900
上面都是错别字什么的

60
00:03:32,390 --> 00:03:33,860
你可以怀疑,老师你的题目

61
00:03:34,460 --> 00:03:36,410
是不是出错了

62
00:03:36,930 --> 00:03:38,720
但是,如果说我题目出得很精致

63
00:03:39,600 --> 00:03:41,150
上面的图也很精致

64
00:03:41,160 --> 00:03:42,550
文字也没有什么错误

65
00:03:43,840 --> 00:03:44,740
但你没做对

66
00:03:46,070 --> 00:03:47,460
应该先反省自己

67
00:03:49,190 --> 00:03:50,730
这个是题外话了

68
00:03:50,740 --> 00:03:53,970
我们回想一下我们以前的情况

1
00:00:02,280 --> 00:00:04,680
就是说,你分完之后合起来

2
00:00:05,190 --> 00:00:07,570
这个值依然要相等

3
00:00:11,790 --> 00:00:13,020
这是我们刚才说过的

4
00:00:13,390 --> 00:00:19,070
代码的截图,已经说过了,都不多说了

5
00:00:21,950 --> 00:00:27,470
所以Money类这里,它就解决这个问题

6
00:00:27,720 --> 00:00:30,500
就是说,分完后相加,等于原值

7
00:00:30,740 --> 00:00:32,340
这里书上也说了

8
00:00:32,850 --> 00:00:35,050
这是我们修改过的译文

9
00:00:35,860 --> 00:00:37,680
你想把一笔钱分给多个目标

10
00:00:37,690 --> 00:00:41,990
不想损失零钱,分配或者分割

11
00:00:42,940 --> 00:00:46,390
allocate这里,给出了代码

12
00:00:48,790 --> 00:00:50,380
这个代码本身的话

13
00:00:52,520 --> 00:00:53,360
这里面没有包括

14
00:00:53,370 --> 00:00:58,010
它已经包含在相关的库里面了

15
00:00:58,140 --> 00:01:01,190
这里面就没有,在相关的库里面了

16
00:01:01,200 --> 00:01:04,240
这地方

1
00:00:02,120 --> 00:00:04,880
我们把这个代码运行完毕

2
00:00:06,040 --> 00:00:06,810
刚才到这里

3
00:00:08,070 --> 00:00:09,390
实际上这个地方

4
00:00:09,750 --> 00:00:12,000
这里,控制台还没出来

5
00:00:12,860 --> 00:00:13,810
继续往下走

6
00:00:15,160 --> 00:00:16,740
直接运行好了

7
00:00:19,340 --> 00:00:19,420

8
00:00:20,550 --> 00:00:23,450
你看这里,就出来了

9
00:00:25,130 --> 00:00:27,640
数据库,入账

10
00:00:28,900 --> 00:00:32,070
在这里

11
00:00:34,660 --> 00:00:36,480
然后就直接在这个地方写出来

12
00:00:36,610 --> 00:00:39,470
在这地方写出来

13
00:00:39,720 --> 00:00:43,410
你计算得到那个数值之后

14
00:00:45,000 --> 00:00:46,480
直接在这里输出

15
00:00:47,040 --> 00:00:49,130
一个两个三个,合同1

16
00:00:49,140 --> 00:00:54,120
2,3。合同1是数据库

17
00:00:54,520 --> 00:01:01,540
这样来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/18531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《公正》孙溟㠭艺术

孙溟㠭艺术《公正》 孙溟㠭艺术《公正》

利用NewGIS平台将FME模板发布为接口

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 一、模板编写 二、发布模板 三、接口获取 四、移动端调用 ​​​​​ 前言 在实际的应用生产过程中,尤其是移动端GIS软件的开发,针对一些闭…

【社区投稿】给 NdArray 装上 CUDA 的轮子

Ndarry是Rust编程语言中的一个高性能多维、多类型数组库。它提供了类似 numpy 的多种多维数组的算子。与 Python 相比 Rust 生态缺乏类似 CuPy, Jax 这样利用CUDA 进行加速的开源项目。虽然 Hugging Face 开源的 candle 可以使用 CUDA backend 但是 candle 项瞄准的是大模型的相…

12.2 通道-阻塞与流程控制、通道型函数、退出通道

阻塞与流程控制 通常在并发程序中要尽力避免阻塞式操作,但有时又需要让代码暂时处于阻塞状态,以等待某种条件、信号或数据,然后再继续运行。 对于无缓冲通道,试图从无人写入的通道中读取,或者向无人读取的通道中写入…

Redis教程(二十一):Redis怎么保证缓存一致性

传送门:Redis教程汇总篇,让你从入门到精通 Redis 的缓存一致性 Redis 的缓存一致性是指在使用 Redis 作为缓存层时,保证缓存中的数据与数据库中的数据保持一致的状态。在分布式系统中,数据一致性是一个重要的问题,因为可能存在多个客户端同时读写同一数据,或者数据在不同…

【量算分析工具-贴地面积】GeoServer改造Springboot番外系列十

【量算分析工具-概述】GeoServer改造Springboot番外系列三-CSDN博客 【量算分析工具-水平距离】GeoServer改造Springboot番外系列四-CSDN博客 【量算分析工具-水平面积】GeoServer改造Springboot番外系列五-CSDN博客 【量算分析工具-方位角】GeoServer改造Springboot番外系列…

SQL学习小记(三)

SQL学习小记(三) 功能实现思路代码部分名词解释 代码打包为可执行文件 功能说明:使用python代码,将数据库database1中的表格table1同步到数据库database2中 功能实现 思路 #mermaid-svg-R1pWrEWA799M299a {font-family:"tre…

go语言方法之基于指针对象的方法

当调用一个函数时,会对其每一个参数值进行拷贝,如果一个函数需要更新一个变量,或者 函数的其中一个参数实在太大我们希望能够避免进行这种默认的拷贝,这种情况下我们就需 要用到指针了。对应到我们这里用来更新接收器的对象的方法…

域名服务器是什么?

所谓域名服务器(即Domain Name Server,简称Name Server、DNS)实际上就是装有域名系统的主机。它是一种分层结构数据库,能够执行域名解析。

Rocksdb原理简介

100编程书屋_孔夫子旧书网 Rocksdb作为当下nosql中性能的代表被各个存储组件(mysql、tikv、pmdk、bluestore)作为存储引擎底座,其基于LSM tree的核心存储结构(将随机写通过数据结构转化为顺序写)来提供高性能的写吞吐时…

Google Benchmark库 简介

在C中,进行性能测试(Benchmarking)是一个常见的需求,用以测量代码块的执行时间,从而对代码进行优化。Google Benchmark库是一个广泛使用的C库,专门用于编写稳健的基准测试。以下是如何使用Google Benchmark…

Visual Studio 的使用

目录 1. 引言 2. 安装和配置 2.1 系统要求 2.2 安装步骤 2.3 初次配置 3. 界面介绍 3.1 菜单栏和工具栏 3.2 解决方案资源管理器 3.3 编辑器窗口 3.4 输出窗口 3.5 错误列表 3.6 属性窗口 4. 项目管理 4.1 创建新项目 4.2 导入现有项目 4.3 项目属性配置 5. 代…

C++之using

using是C11引入的关键字 1、类型别名 using可以用来为类型创建一个新的名字,方便代码维护。 // 定义类型别名 using data_type short;// 使用 data_type value 5;2、命名空间别名 using可以为非常长的命名空间创建一个别名,方便使用。 namespace ve…

当传统文化遇上数字化,等级保护测评的必要性

第二十届中国(深圳)国际文化产业博览交易会5月23日在深圳开幕。本届文博会以创办20年为契机,加大创新力度,加快转型升级,着力提升国际化、市场化、专业化和数字化水平,不断强化交易功能,打造富有…

《软件方法(下)》8.3.4.6 DDD话语“聚合”中的伪创新(1)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.3 建模步骤C-2 识别类的关系 8.3.4 识别关联关系 8.3.4.6 DDD话语“聚合”中的伪创新 DDD话语中也有“聚合”。Eric Evans的“Domain-Driven Design: Tackling Complexity in the…

在今日头条上写文章:ChatGPT完整使用教程

了解如何充分运用ChatGPT进行创作 简介 在今日头条上发布文章变得越来越方便。本文旨在详细解析如何运用ChatGPT来创作文章,并提供全方位的使用指南及常见问题的答疑。 第一步:基础准备 确保你已注册今日头条账号。 登录ChatGPT并与你的今日头条账号进…

华为、华三、思科、锐捷交换机路由器设备命令行常见错误信息

目的 使用CLI命令行界面,如果输入错误,系统将会向用户报告错误信息。 知己知彼,方能百战不殆。下面是小木为大家收集整理的几大厂商常见的命令行错误提示。 华为设备命令行常见错误信息 Error: Unrecognized command found at ^ position. …

Java中的CAS(Compare-And-Swap)操作详解

一、技术难点 CAS操作,全称为Compare-And-Swap,是Java并发编程中的一个重要概念,其技术难点主要体现在以下几个方面: 原子性保证:CAS操作必须保证整个操作的原子性,即在多线程环境中,当一个线…

mysql 删除重复数据 关联自己 关联子查询 delete

有手工录入的数据时&#xff0c;删除系统定时任务计算的数据。 delete from t1 using data_tab as t1, (select * from (select input_type,system_code,DATE_FORMAT(start_time,%Y-%m-%d) as date_ from data_tab where start_time >2024-05-20 and start_time <2024-…

软件测试经理工作日常随记【6】-利用python连接禅道数据库并自动统计bug数据到钉钉群

测试管理_利用python连接禅道数据库并统计bug数据到钉钉 这篇不多赘述&#xff0c;直接上代码文件。 另文章基础参考博文&#xff1a;参考博文 加以我自己的需求优化而成。 统计的前提 以下代码统计的前提是禅道的提bug流程应规范化 bug未解决不删除bug未关闭不删除 db_…