论坛首页 Java企业应用论坛

详解spring事务属性

浏览 132592 次
该帖已经被评为良好帖
作者 正文
   发表时间:2007-05-14  
"jdbc with "save points" supports suspend and resume"
这个好像没什么依据
如:suspend后如果rollback,并不应该rollback到savepoint,而应该是最前面的那个。

关于suspend,我看了下源码,对于DataSourceTransactionManager,只是做了unbindResource from a ThreadLocal,而spring封装的transaction只操作(如commit/rollback)其bind的Resource,也就是说系统的操作不会影响到被这个unbind的Transaction。
而resume则执行重新bind操作,这样当前Transaction又加入到当前系统可操作(如commit/rollback)的Resouce列队中。

其它TransactionManager也有些类似。
0 请登录后投票
   发表时间:2007-05-15  
moshalanye 写道
   谢谢楼主的简洁的解说,对自己帮助很大,我对spring的事物没有太深的认识,所以我想问下,在一般我们在使用AOP处理事物,使用的是最简单的异常捕捉的事物回滚的拦截器,因为复杂点的事物回滚都是需要更多的信息的,就象前面要回滚到哪里,那么那些标志flag信息也会在莫个地方存取的吧? 能介绍下吗?  呵呵


这个问题我来回答下,spring的声明式事务和j2ee的完全一样。
即:
默认情况下,发生运行时异常事,事务将被回滚;发生受查异常(checked exception)时,不回滚。
即,如果你自己在服务层抛出受查异常(checked exception)时,别指望Spring会帮你回滚事务。
如果希望,可以这么声明:

		<property name="transactionAttributes">
			<props>
				<prop key="save*">PROPAGATION_REQUIRED</prop>
				<prop key="insert*">PROPAGATION_REQUIRED</prop>
				<prop key="remove*">PROPAGATION_REQUIRED</prop>
				<prop key="init*">PROPAGATION_REQUIRED</prop>
				<prop key="disconnect*">
					PROPAGATION_REQUIRED,
					-DataSourceDisconnectException
				</prop>
				<prop key="connect*">
					PROPAGATION_REQUIRED, -DataSourceConnectException
				</prop>
				<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
			</props>
		</property>


其中-DataSourceDisconnectException,表示发生这个异常时,将回滚事务。反之,+开始的异常定义发生这样的异常也不回滚(好像不怎么常用)。
0 请登录后投票
   发表时间:2007-05-17  
ISOLATION_READ_COMMITTED是在这个事务提交前其他事务看不到数据的变化(别人看不到我的变化)
ISOLATION_REPEATABLE_READ是在同一个事务中保证了重复读取的数据是一致的,即不能读取其他事务提交的数据(我看不到别人变化)
ISOLATION_SERIALIZABLE是在同一个事务中保证重复读取的数据条数是一致的,感觉也是在这个事务没结束之前不能读取其他事务提交的数据(我看不到别人变化)
可以这样理解吗?
0 请登录后投票
   发表时间:2007-05-23  
xly_971223 写道
ISOLATION_READ_COMMITTED是在这个事务提交前其他事务看不到数据的变化(别人看不到我的变化)
ISOLATION_REPEATABLE_READ是在同一个事务中保证了重复读取的数据是一致的,即不能读取其他事务提交的数据(我看不到别人变化)
ISOLATION_SERIALIZABLE是在同一个事务中保证重复读取的数据条数是一致的,感觉也是在这个事务没结束之前不能读取其他事务提交的数据(我看不到别人变化)
可以这样理解吗?


不是这个概念吧!!!
0 请登录后投票
   发表时间:2007-05-23  
klyuan 写道
xly_971223 写道
ISOLATION_READ_COMMITTED是在这个事务提交前其他事务看不到数据的变化(别人看不到我的变化)
ISOLATION_REPEATABLE_READ是在同一个事务中保证了重复读取的数据是一致的,即不能读取其他事务提交的数据(我看不到别人变化)
ISOLATION_SERIALIZABLE是在同一个事务中保证重复读取的数据条数是一致的,感觉也是在这个事务没结束之前不能读取其他事务提交的数据(我看不到别人变化)
可以这样理解吗?


不是这个概念吧!!!

那还得去仔细理解一下
0 请登录后投票
   发表时间:2007-05-23  
klyuan 写道
eddie 写道
daquan198163 写道
klyuan 写道
daquan198163 写道
当然是支持的了
methodA是在内部对methodB直接调用,他们在同一个类中,调用不能被aop拦截到


这个要看你的声明方式,与是否在同一个类中没有任何关系!!!

只是看你的切点和切面在哪里!!!

你确定么?
切点和切面在哪里也要先拦截到才能发挥作用阿
这就好比:即便你为一个bean配置了事务,但如果别人直接去调用这个类的实现而不是你配置的那个AOP代理,那么这个调用就完全不是事务的了!


daquan198163说的是对的,同一个类里面2个方法的互相调用,第2个方法的事务声明方式不会起任何作用。
因为声明式事务都是通过事务代理类-即AOP层来实现的,类里面的直接调用是没有通过AOP代理类的,它也不能可进行拦截,所以被调用的方法的事务声明不会生效。


如果是单纯的方法调用,的确是不会产生拦截的!!!
不过倒底是不是这样还需要证实!!



虽然methodB没有被代理但是 处于methodA的事物中,
相当于methodA切的一段代码块,事物还是有效的.
0 请登录后投票
   发表时间:2007-07-27  
作者就是上善若水? 这篇文章俺貌似在CSDN上一名叫上善若水的BLOG中见过
0 请登录后投票
   发表时间:2007-08-02  
klyuan 写道
spiritfrog 写道
好文章!但是为什么使用PROPAGATION_REQUIRES_NEW,就一定要使用JtaTransactionManager作为事务管理器呢?


因为需要把前一个事务挂起!!!
目前只有jta事务管理器才能实现把事务挂起和恢复事务!!!


貌似并非如此,HibernateTransactionManager,DataSourceTransactionManager都支持,只要支持的suspend 和 resume操作的事务管理器都支持.
0 请登录后投票
   发表时间:2007-08-02  

klyuan 写道:

daquan198163 写道:
关于事务传播属性还有一个常见的误解:
java 代码
 
  1. class A{  
  2.   
  3. //事务属性 PROPAGATION_REQUIRED
  4. methodA(){ 
  5.       ......
  6.       ......
  7.       methodB();  
  8. }  
  9.   
  10. //事务属性 PROPAGATION_REQUIRES_NEW
  11. methodB(){  
  12.       .......  
  13. }  
  14.   
  15. }  

此时外部程序对methodA的调用只会发起一个事务,methodB的PROPAGATION_REQUIRES_NEW属性不会起作用
因为methodA是在内部对methodB直接调用,AOP声明式事务自然就不起作用了
所以外部程序对methodB的调用仍然是PROPAGATION_REQUIRES_NEW的
我不太明白!!!你是支持上面这种说法还是不支持!!!
“此时外部程序对methodA的调用只会发起一个事务,methodB的PROPAGATION_REQUIRES_NEW属性不会起作用
因为methodA是在内部对methodB直接调用,AOP声明式事务自然就不起作用了
实际情况并不是这样子的!!!

 

 

测试了很多遍,如果是在同一类中的方法,直接调用methodB, AOP一点作用都起不了。不论是使用那种声明方式,结果都一样









0 请登录后投票
   发表时间:2007-09-05  
最近也给这个困扰了,打算看看spring2.0的
不用字节码继承父类的话,内部调用不起作用,
用debug设置一下断点,看堆栈就可看出来了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics