. r" A9 @, J& m7 _/ E( K8 I( z0 b# F) D" m F' K' E. P& t5 m
+ E0 Y- k* S" p' g8 |: g 2 G& N! n/ h# E( Y1 t7 ?3 K+ i* P三、readOnly$ A! K# S# e$ m) {/ k9 v& m" I
. a. X2 F( Q. \7 D
事务属性中的readOnly标志表示对应的事务应该被最优化为只读事务。 7 h: |# @! D- V' o2 B7 }% q6 [ S( ]' y& y8 Q/ c
这是一个最优化提示。在一些情况下,一些事务策略能够起到显著的最优化效果,例如在使用Object/Relational映射工具(如:hibernate或TopLink)时避免dirty checking(试图“刷新”)。/ ]; `5 D6 d$ h7 }2 y
5 N5 R4 G1 s" H: m7 e四、Timeout; D3 e* U4 L" q, n* p
9 Y2 K$ A. l* k9 S( V4 P
在事务属性中还有定义“timeout”值的选项,指定事务超时为几秒。在JTA中,这将被简单地传递到J2EE服务器的事务协调程序,并据此得到相应的解释* y0 R9 o5 P O, S' i1 A' u
, F% o" v, b) h% |( c$ ~4 ^+ W+ R8 K7 b. k) Z2 X3 N- J3 C1 V* j, }! G
2 [0 j. @* u j0 _9 |3 t# v
5 O3 L9 H* {. R
- a2 p: H& H1 {$ N$ b
总结: 1 g1 B! d1 E" b" U$ ~ 8 ]7 k4 c" g6 w4 H2 w1 M<aop:config proxy-target-class="true"> 8 o, d% q% [( X7 g1 D
<aop:advisor pointcut="execution(* com.company..*Manager.*(..))" # Q# N8 }" x2 x5 d" v' p advice-ref="txAdvice" /> 7 `+ w. O: f& w* S! [; N" G& F
</aop:config> 5 B, J( d6 E8 z& o 7 P/ e% J( X& I# ^: B8 r<tx:advice id="txAdvice"> 7 U% J1 Z+ ~$ z( t$ D' v3 } D <tx:attributes> . v" o6 h4 y) b! Q, C E; G <tx:method name="save*" isolation="DEFAULT/READ_COMMITTED/READ_UNCOMMITTED/REPEATABLE_READ/SERIALIZABLE]"/> " C2 Q" I b; e. B/ u5 t
<tx:method name="update*" <tx:method name="update*" propagation="MANDATORY/NESTED/NEVER/NOT_SUPPORTED/REQUIRED/REQUIRES_NEW/SUPPORTS">/> & i9 z# d/ _6 |0 E" E; W. Y3 W
<tx:method name="delete*" /> ' K# I- ^# O0 D# z: W <tx:method name="find*" read-only="true" /> - ~0 i& U8 j: w% \, M
</tx:attributes> 4 x6 @0 c/ w) A- q1 k( t</tx:advice> - T' \9 ~6 e9 ^* x1 ?+ \ X& e% |: ?8 P0 l9 S! r
" I8 h0 i2 {" q' u3 L 3 N: T$ q3 ~5 n7 n # E# I3 B- ~' j isolation设定事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据。 定义的5个不同的事务隔离级别: DEFAULT:默认的隔离级别,使用数据库默认的事务隔离级别 READ_COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。 READ_UNCOMMITTED:这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。 REPEATABLE_READ:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免不可重复读。 SERIALIZABLE:这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。 % R S t+ D0 j, c$ N. h jpropagation定义了7个事务传播行为 REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,SUPPORTS与不使用事务有少许不同。 REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。 NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。 NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常 NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。. h5 I" S' m8 S* Z
% [8 g% u8 F* g7 i# y6 U6 l
嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。 + _! h# e* F7 P
9 x5 R: V; H+ r8 I' j
原文转自:http://www.cnblogs.com/shitianzeng/articles/2319090.html , ] [% D7 s- c+ x7 b' B4 l& q + D' j4 j" n! J9 ^% W