锁定老帖子 主题:详解spring事务属性
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间: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也有些类似。 |
|
返回顶楼 | |
发表时间: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,表示发生这个异常时,将回滚事务。反之,+开始的异常定义发生这样的异常也不回滚(好像不怎么常用)。 |
|
返回顶楼 | |
发表时间:2007-05-17
ISOLATION_READ_COMMITTED是在这个事务提交前其他事务看不到数据的变化(别人看不到我的变化)
ISOLATION_REPEATABLE_READ是在同一个事务中保证了重复读取的数据是一致的,即不能读取其他事务提交的数据(我看不到别人变化) ISOLATION_SERIALIZABLE是在同一个事务中保证重复读取的数据条数是一致的,感觉也是在这个事务没结束之前不能读取其他事务提交的数据(我看不到别人变化) 可以这样理解吗? |
|
返回顶楼 | |
发表时间:2007-05-23
xly_971223 写道 ISOLATION_READ_COMMITTED是在这个事务提交前其他事务看不到数据的变化(别人看不到我的变化)
ISOLATION_REPEATABLE_READ是在同一个事务中保证了重复读取的数据是一致的,即不能读取其他事务提交的数据(我看不到别人变化) ISOLATION_SERIALIZABLE是在同一个事务中保证重复读取的数据条数是一致的,感觉也是在这个事务没结束之前不能读取其他事务提交的数据(我看不到别人变化) 可以这样理解吗? 不是这个概念吧!!! |
|
返回顶楼 | |
发表时间:2007-05-23
klyuan 写道 xly_971223 写道 ISOLATION_READ_COMMITTED是在这个事务提交前其他事务看不到数据的变化(别人看不到我的变化)
ISOLATION_REPEATABLE_READ是在同一个事务中保证了重复读取的数据是一致的,即不能读取其他事务提交的数据(我看不到别人变化) ISOLATION_SERIALIZABLE是在同一个事务中保证重复读取的数据条数是一致的,感觉也是在这个事务没结束之前不能读取其他事务提交的数据(我看不到别人变化) 可以这样理解吗? 不是这个概念吧!!! 那还得去仔细理解一下 |
|
返回顶楼 | |
发表时间:2007-05-23
klyuan 写道 eddie 写道 daquan198163 写道 klyuan 写道 daquan198163 写道 当然是支持的了
methodA是在内部对methodB直接调用,他们在同一个类中,调用不能被aop拦截到 这个要看你的声明方式,与是否在同一个类中没有任何关系!!! 只是看你的切点和切面在哪里!!! 你确定么? 切点和切面在哪里也要先拦截到才能发挥作用阿 这就好比:即便你为一个bean配置了事务,但如果别人直接去调用这个类的实现而不是你配置的那个AOP代理,那么这个调用就完全不是事务的了! daquan198163说的是对的,同一个类里面2个方法的互相调用,第2个方法的事务声明方式不会起任何作用。 因为声明式事务都是通过事务代理类-即AOP层来实现的,类里面的直接调用是没有通过AOP代理类的,它也不能可进行拦截,所以被调用的方法的事务声明不会生效。 如果是单纯的方法调用,的确是不会产生拦截的!!! 不过倒底是不是这样还需要证实!! 虽然methodB没有被代理但是 处于methodA的事物中, 相当于methodA切的一段代码块,事物还是有效的. |
|
返回顶楼 | |
发表时间:2007-07-27
作者就是上善若水? 这篇文章俺貌似在CSDN上一名叫上善若水的BLOG中见过
|
|
返回顶楼 | |
发表时间:2007-08-02
klyuan 写道 spiritfrog 写道 好文章!但是为什么使用PROPAGATION_REQUIRES_NEW,就一定要使用JtaTransactionManager作为事务管理器呢?
因为需要把前一个事务挂起!!! 目前只有jta事务管理器才能实现把事务挂起和恢复事务!!! 貌似并非如此,HibernateTransactionManager,DataSourceTransactionManager都支持,只要支持的suspend 和 resume操作的事务管理器都支持. |
|
返回顶楼 | |
发表时间:2007-08-02
klyuan 写道: daquan198163 写道: 关于事务传播属性还有一个常见的误解:
java 代码
此时外部程序对methodA的调用只会发起一个事务,methodB的PROPAGATION_REQUIRES_NEW属性不会起作用 因为methodA是在内部对methodB直接调用,AOP声明式事务自然就不起作用了 所以外部程序对methodB的调用仍然是PROPAGATION_REQUIRES_NEW的 我不太明白!!!你是支持上面这种说法还是不支持!!!
“此时外部程序对methodA的调用只会发起一个事务,methodB的PROPAGATION_REQUIRES_NEW属性不会起作用
因为methodA是在内部对methodB直接调用,AOP声明式事务自然就不起作用了” 实际情况并不是这样子的!!!
测试了很多遍,如果是在同一类中的方法,直接调用methodB, AOP一点作用都起不了。不论是使用那种声明方式,结果都一样 |
|
返回顶楼 | |
发表时间:2007-09-05
最近也给这个困扰了,打算看看spring2.0的
不用字节码继承父类的话,内部调用不起作用, 用debug设置一下断点,看堆栈就可看出来了 |
|
返回顶楼 | |