首页 新闻 会员 周边

触发器中有必要再用事务吗

0
[已关闭问题]

代码
1 ALTER TRIGGER [dbo].[trg_mm07moc_upd] ON [dbo].[pnmmmoc] --//WITH ENCRYPTION --//生产入库单头update触发器,依据库存影响方向,决定制令影响
2 FOR update
3 AS
4 if not update(mm07) return
5 declare @ls_mm01 char(3), --//单别
6 @ls_mm02 char(6), --//单号
7 @ls_dealdate char(8),--//异动日期
8 @ls_newstatus char(1), --//新状态
9 @ls_orgstatus char(1), --//原状态
10 @ls_pline char(6), --//生产线别
11 @ls_lineno char(3), --//序号
12 @ls_partid char(20), --//品号
13 @ls_unit char(4), --//单位
14 @ls_storage char(6), --//库别
15 @ld_invqty numeric(11,3),--//数量
16 @ld_unitprice numeric(20,4),--//单价
17 @ld_amount numeric(20,4), --//金额
18 @ls_lotno char(10), --//批号
19 @ls_remark char(36), --//备注
20 @li_return integer, --//存储过程返回值,0成功,-1失败
21 @li_errflag integer, --//错误标示,
22 @ls_invhandle char(1), --//由单据性质决定库存影响
23 @ls_invflag char(1), --//库存影响由状态变换决定
24 @ls_ioflag char(1) --// 库存异动出入库标示(I/O)
25
26 declare @ll_count integer
27 declare @ls_mn08 char(3), --//制令别
28 @ls_mn09 char(8), --//制令号
29 @ls_mochandle char(1), --//制令品号已生产量影响+,-
30 @ls_flowname char(12) --//单据类型
31
32 declare @ls_mn17 char(3),
33 @ls_mn18 char(6),
34 @ls_mn19 char(3)
35
36 declare @ls_partname char(24) --//品名
37 declare @ls_partspec char(36) --//规格
38 declare @ls_temp char(20) --//线别中文
39 declare @ls_macolor char(10)
40
41 declare @ld_mb04 numeric(11,3)
42 declare @ls_mm07 char(1)
43 declare @ls_status char(1)
44 declare @ld_yd20 numeric(11,3)--//dc
45 declare @ld_yd21 numeric(10,0)--ts
46 declare @ls_yd22 char(10)--kf
47 declare @ld_maht numeric(11,3)
48 --以下是新加的
49 declare @ls_editor char(10)
50 declare @ls_approv char(10)
51 declare @ls_mn03 char(6),
52 @ls_mn04 char(8),
53 @ls_mn05 char(10),
54 @ld_mn07 numeric(11,4),
55 @ld_mnht numeric(11,4),
56 @ls_ma03 char(255),
57 @ls_ma28 char(30),
58 @ls_md01 char(20),
59 @ls_hm04 char(30),
60 @ls_hm02 char(255),
61 @ls_hm08 char(10),
62 @ld_hm06 numeric(11,4)
63 declare @ld_count integer
64 declare @li_count integer
65 declare @ls_hr04 char(10)
66 begin transaction
67 select @li_return=0
68 select @li_errflag=0
69
70
71 select @ls_mm01=mm01,@ls_mm02=mm02,@ls_dealdate=mm03,@ls_newstatus=mm07,@ls_status=status,
72 @ls_pline=mm08,@ls_editor=editor from inserted
73 select @ls_orgstatus=mm07 from deleted
74 select @ls_invhandle=isnull(ba08,'0') from pnsysba where ba01=@ls_mm01
75
76 declare trg_mocmn cursor for
77 select mn03,mn04,mn05,mn06,mn07,mn10,remark,mn08,mn09,mn15,mn16,mn17,mn18,mn19,mn22,mn23,mn25,mnht
78 from pnmocmn where mn01=@ls_mm01 and mn02=@ls_mm02
79
80 open trg_mocmn
81 fetch next from trg_mocmn into
82 @ls_lineno,
83 @ls_partid,
84 @ls_unit,
85 @ls_storage,
86 @ld_invqty,
87 @ls_lotno,
88 @ls_remark,
89 @ls_mn08,
90 @ls_mn09,
91 @ld_unitprice,
92 @ld_amount,
93 @ls_mn17,
94 @ls_mn18,
95 @ls_mn19,
96 @ld_yd20,
97 @ld_yd21,
98 @ls_yd22,
99 @ld_maht
100
101 while (@@fetch_status=0)
102 begin
103 if @ls_orgstatus='N' and @ls_newstatus='Y' --//单据确认
104 begin
105 if @ls_status='N'
106 begin
107 select @li_errflag=-1
108 raiserror('此入库单为失效状态,不能进行报关!',16,-1,@ls_mm02)
109 goto EndProcess
110 end
111 select @li_count=count(*) from pninvma where rtrim(ma01)=@ls_partid and ma28=''
112 if @li_count =1
113 begin
114 select @li_errflag=-1
115 raiserror('出货单中的企业品号在基础档中没有指定海关品号,不能报关!',16,-1,@ls_partid)
116 goto EndProcess
117 end
118 if @ls_invhandle='+' --//库存增加,入库
119 select @ls_ioflag='I'
120 ELSE if @ls_invhandle='-' --//库存减少,出库
121 select @ls_ioflag='O'
122 ELSE if @ls_invhandle='0' --//库存无影响
123 select @ls_ioflag='*'
124
125 select @ls_flowname='生产入库'
126
127 if @ls_invhandle='+'
128 select @ls_hr04='BR'
129 ELSE if @ls_invhandle='-'
130 select @ls_hr04='BF'
131
132 select @ls_partspec=ma03,@ls_ma28=rtrim(ma28) from pninvma where rtrim(ma01)=@ls_partid
133 select @ls_hm02=hm02,@ls_hm04=hm04,@ls_hm08=hm08,@ld_hm06=hm06 from pnhghm where rtrim(hm01)=@ls_ma28
134 --单身@ls_hr04
135
136 Insert huhghs values (@ls_mm01,@ls_mm02,@ls_lineno,@ls_dealdate,'','YD','BC','','',@ls_mm01+@ls_mm02+@ls_lineno,
137 '',@ls_lotno,@ls_remark,@ls_mn08+'-'+@ls_mn09,@ls_hm04,@ls_ma28,@ls_partid,@ls_hm02,@ls_partspec,0,
138 @ls_hm08,@ld_invqty,@ls_unit,@ld_maht,@ld_hm06,0,0)
139
140 if @@error<>0
141 begin
142 Select @li_errflag=-1
143 break
144 end
145 select @ld_count=1 --//单身成功
146 end -----//更新
147
148 fetch next from trg_mocmn into
149 @ls_lineno,
150 @ls_partid,
151 @ls_unit,
152 @ls_storage,
153 @ld_invqty,
154 @ls_lotno,
155 @ls_remark,
156 @ls_mn08,
157 @ls_mn09,
158 @ld_unitprice,
159 @ld_amount,
160 @ls_mn17,
161 @ls_mn18,
162 @ls_mn19,
163 @ld_yd20,
164 @ld_yd21,
165 @ls_yd22,
166 @ld_maht
167 end --//游标循环结束*********************************
168 close trg_mocmn
169 deallocate trg_mocmn
170 --------------------------------------------------------------------------
171 if @li_errflag=-1 goto EndProcess
172
173 if @ld_count=1 --//单身成功,才产生单头
174 begin
175 if @ls_invhandle='+'
176 select @ls_hr04='BR'
177 ELSE if @ls_invhandle='-'
178 select @ls_hr04='BF'
179
180 Insert huhghr values (@ls_mm01,@ls_mm02,@ls_dealdate,
181 @ls_hr04,'YD','BC','','','','','N',0,@ls_editor,getdate(),'','','','')
182 if @@error<>0
183 begin
184 select @li_errflag=-1
185 raiserror('插入报关入库单头HUHGHR失败!',16,-1,@ls_mm02)
186 goto EndProcess
187 end
188
189 end ----------------------产生单头@ls_hr04
190 if @ls_orgstatus='Y' and @ls_newstatus='N' --//报关取消
191 begin
192 select @li_count=count(*) from huhghr where hr01=@ls_mm01 and hr02=@ls_mm02 and status='Y'
193 if @li_count >0
194 begin
195 select @li_errflag=-1
196 raiserror('报关中的入库单不为失效状态,不能取消报关!',16,-1,@ls_mm02)
197 goto EndProcess
198 end
199
200 delete huhghs where hs01=@ls_mm01 and hs02=@ls_mm02
201 delete huhghr where hr01=@ls_mm01 and hr02=@ls_mm02
202 end
203 EndProcess:
204 if @li_errflag=0
205 commit transaction
206 else rollback transaction

如上述代码,触发器本是一个隐含的事务,中间再使用事务是不是有点多余呢?

问题补充: 第66行
angtianqiang的主页 angtianqiang | 初学一级 | 园豆:110
提问于:2010-07-27 15:30
< >
分享
其他回答(1)
0

 首先要看你数据库的隔离级别有四种

Read Uncommitted:
直译就是"读未提交",意思就是即使一个更新语句没有提交,但是别
的事务可以读到这个改变.这是很不安全的.

Read Committed:
直译就是"读提交",意思就是语句提交以后即执行了COMMIT以后
别的事务就能读到这个改变.

Repeatable Read:
直译就是"可以重复读",这是说在同一个事务里面先后执行同一个
查询语句的时候,得到的结果是一样的.

Serializable:
直译就是"序列化",意思是说这个事务执行的时候不允许别的事务
并发执行.

看你设成什么隔离级别,决定您是否要写事务

孤独的叶子 | 园豆:205 (菜鸟二级) | 2010-07-27 15:37
0

我不推荐触发器写的太复杂,也不推荐些事务,如果真的很复杂就在业务逻辑层面实现.个人观点.

changbluesky | 园豆:854 (小虾三级) | 2010-07-27 22:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册