|
那里的许多示例都主张对数据库事务进行显式回滚,具体方法如下:! a0 ~, y! h8 |9 \- ~
using (var transaction = ...), X, v" X/ z2 f/ l. I% l7 M
{, j: j9 I. L! h2 [
try
1 _1 a7 v: `+ f/ o( n, I! ^# f( K {) e+ ` [- Q1 q7 |: s \; |
// do some reading and/or writing here
' ]/ z0 B8 T( S' N5 _# G" ]9 ~$ W transaction.Commit();; |" @1 T. i3 T; p: Z
}9 S* f4 q, ^- z& h- s- V
catch (SqlException ex)
0 \4 M* a8 E8 H A3 E: H {: K' L# X6 a3 p, z% P
// explicit rollback! |. g2 i. g, E, c% P8 k# e, Z
transaction.Rollback();" J: g* `% X/ u6 n
}# S" _& Z, s! Y g* E$ {9 B* a7 r
}
1 O/ N2 X! r9 M. }/ v( V x* Z% S但是,我倾向于这样做:! v, I* e' z! r: o
using (var transaction = ...)
1 n% V8 [! r7 F# [{2 B+ o( T# R7 u5 z+ ~0 l0 F
// do some reading and/or writing here
* q* Q/ K& d- h; m7 e" u transaction.Commit();
" G' |3 ^% Y) T4 E9 m5 I* N3 f4 G}, W# x, Q4 }& b( w H& V& W
当发生异常时,我只是依靠未提交事务的隐式回滚。
: M( K7 ?: `3 U9 R依靠这种隐式行为有什么问题吗?有人有令人信服的理由为什么我不应该这样做吗?# h+ V8 e3 X% y, d* h
6 x y+ Q/ I7 a( s! b
解决方案:6 U/ a r, Y P; P' x7 F7 n2 L2 S
# s6 X1 j$ z2 h9 B: e. j: g
' k1 P. I7 ~8 L0 j
, [* q' P' b5 W* ?* T! Y) n6 @) k
不,它不是特别需要的,但是我可以想到两个可能是个好主意的原因:
' ^" Q2 O$ j2 r4 K明晰3 O+ m3 }# `4 B+ i: w6 v
$ G7 U+ a, Q S6 G2 ~- e4 R有人可能会争辩说使用transaction.Rollback()可以更清楚地表明在什么情况下不会进行交易。
! _4 s. n# _: h, X/ @5 Z释放锁/ h% |, b4 C% g
) M4 O6 y- M, o) ]" A% W: x. u
在处理事务时,重要的是要意识到某些锁定仅在事务回滚或提交时才被释放。如果您正在使用该using语句,则在处理该事务时将回滚该事务,但是如果由于某种原因您需要在using块内进行一些错误处理,则在回滚之前删除该事务(删除锁)可能会比较有利。执行复杂/耗时的错误处理。 |
|