9 m9 m2 _2 V& Z S$ q+ [: o, D4 Y1、Serializable:最严格的级别,事务串行执行,资源消耗最大; & J: z& {% m( ]: G: a/ X+ N; p1 C+ z$ g4 a
2、REPEATABLE READ:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。2 v/ b- b" I8 A( r: H" u
; \. r U: ]6 h4 h1 k+ \3、READ COMMITTED:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。% |; a. P. J& s7 q" W
* Y: r7 ], b' x# p; \+ q- G
4、Read Uncommitted:保证了读取过程中不会读取到非法数据。隔离级别在于处理多事务的并发问题。. V, T, R% A6 C( q! c: P# w1 u0 Z
# c6 V9 j* m# @9 Z) K' X
我们知道并行可以提高数据库的吞吐量和效率,但是并不是所有的并发事务都可以并发运行,这需要查看数据库教材的可串行化条件判断了。0 d( q. ^2 c) ]- D! H6 s- h
2 s" L# C2 h" }$ r" c
这里就不阐述。& X$ F0 r! M3 ~8 k s8 p& Z2 n
% c2 |9 u" ]1 b+ F+ j, V
我们首先说并发中可能发生的3中不讨人喜欢的事情 ) I2 L5 l4 a; C" F3 X! z2 h. m; M1 e. Q' B
1: Dirty reads--读脏数据。也就是说,比如事务A的未提交(还依然缓存)的数据被事务B读走,如果事务A失败回滚,会导致事务B所读取的的数据是错误的。 * U* w" o" `- D% M& x / e+ r* W Q! B7 F2 I& K6 f. B7 u2: non-repeatable reads--数据不可重复读。比如事务A中两处读取数据-total-的值。在第一读的时候,total是100,然后事务B就把total的数据改成 200,事务A再读一次,结果就发现,total竟然就变成200了,造成事务A数据混乱。 - p8 n0 g7 s3 t 4 ^6 _' e, c# B3 H8 _0 l3: phantom reads--幻象读数据,这个和non-repeatable reads相似,也是同一个事务中多次读不一致的问题。但是non-repeatable reads的不一致是因为他所要取的数据集被改变了(比如total的数据),但是phantom reads所要读的数据的不一致却不是他所要读的数据集改变,而是他的条件数据集改变。比如Select account.id where account.name="ppgogo*",第一次读去了6个符合条件的id,第二次读取的时候,由于事务b把一个帐号的名字由"dd"改成"ppgogo1",结果取出来了7个数据。 5 o8 k# @% p' l/ q3 M4 f - {7 q9 o( o |' \* h' K ( l7 n; i; I0 N! [& U, H1 p: c y! C, U2 y* s/ N
Dirty reads non-repeatable reads phantom reads " P, u" [+ \% f% hSerializable 不会 不会 不会2 d' b) h/ c0 \) ~, ?. V
REPEATABLE READ 不会 不会 会2 G. T5 H8 F2 Q, o. A( M
READ COMMITTED 不会 会 会' S0 W( M6 V4 a) I" v5 I: g7 Q
Read Uncommitted 会 会 会9 N0 L/ d3 @. G8 _
. g$ d/ c3 q1 M. E6 ]) f! ?& d) h! w6 o a
( b0 m. d" F4 [ ~5 R8 k/ c8 Q4 D
0 G7 w9 |9 d' n2 \1 L# Q- I/ t0 G
三、readOnly H: b3 t. v; W. T - U- r# o4 |+ H7 L事务属性中的readOnly标志表示对应的事务应该被最优化为只读事务。0 S6 l* t. u, q; |7 I
8 j! b7 k3 a3 l这是一个最优化提示。在一些情况下,一些事务策略能够起到显著的最优化效果,例如在使用Object/Relational映射工具(如:hibernate或TopLink)时避免dirty checking(试图“刷新”)。& @. O% m- U% v" K8 M
4 Q! b7 M& w. d% ^$ m0 [* U# Q
四、Timeout' p) t( u) }+ ~( t
! s1 ^2 c0 s) Y0 f# {( Z
在事务属性中还有定义“timeout”值的选项,指定事务超时为几秒。在JTA中,这将被简单地传递到J2EE服务器的事务协调程序,并据此得到相应的解释 * r- y! u$ q/ Z, F) u& U 9 F; V* w; D; S( L9 P' \8 R7 k( Y! p6 Z8 d7 o9 a# j3 h
0 o" ]4 I2 [1 }* L% [2 z, h6 h# \ E& e
' S- y4 Y( c6 [总结:+ u% C8 H: l' C b: ]- g
# W+ M) v" v7 V% {
<aop:config proxy-target-class="true"> . h4 r/ M, i, o2 D; y. } <aop:advisor pointcut="execution(* com.company..*Manager.*(..))" % [. M+ c5 J* H( P4 J: L- ~
advice-ref="txAdvice" /> $ o3 w& r; r& R# E; O6 ^* A- P( [; D</aop:config> & P& Y7 [" k& j; @! M; k. e7 j
' f4 ]9 ?; [) u R! j" E# c<tx:advice id="txAdvice"> % `6 I6 X/ n$ g, b# n7 q
<tx:attributes> 0 m: F4 o/ j# \
<tx:method name="save*" isolation="DEFAULT/READ_COMMITTED/READ_UNCOMMITTED/REPEATABLE_READ/SERIALIZABLE]"/> , B' g, _* I: R: M9 a, q$ K- L <tx:method name="update*" <tx:method name="update*" propagation="MANDATORY/NESTED/NEVER/NOT_SUPPORTED/REQUIRED/REQUIRES_NEW/SUPPORTS">/> 6 l# }/ v+ R5 t' F1 I4 X
<tx:method name="delete*" /> X: B9 p& u$ f+ N1 g* O <tx:method name="find*" read-only="true" /> 3 w# j3 U* H! N
</tx:attributes> - C2 F* f3 U: O7 H% H
</tx:advice> , ~8 \" ]' t; p4 ~3 S9 C' V- Z4 _7 D9 I6 m. c' Y: t7 {+ J
8 S9 H0 w, j! I' J! n7 w
! p; w' A4 [. m O( V& m0 V% O# v0 |* E N/ m
isolation设定事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据。 定义的5个不同的事务隔离级别: DEFAULT:默认的隔离级别,使用数据库默认的事务隔离级别 READ_COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。 READ_UNCOMMITTED:这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。 REPEATABLE_READ:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免不可重复读。 SERIALIZABLE:这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。 ' S1 k" j# M1 n% u$ _; |propagation定义了7个事务传播行为 REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,SUPPORTS与不使用事务有少许不同。 REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。 NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。 NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常 NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。% ^6 Y/ |+ D& |7 e. e
, R; P% r- U! ~" b- ~7 s: l( z嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。 * o' z) C$ v2 A$ M% K7 h& s4 N; _) n/ O7 x4 Y1 k, w
原文转自:http://www.cnblogs.com/shitianzeng/articles/2319090.html ' J4 V5 h5 N: j4 u/ N' b: f % ?% G3 I, l4 Y+ P b