◎筱米加步枪◎.Blog

Happy coding

Spring中事务的作用范围

下面一种情景:

在做项目中通常会进行分层架构.假设可分为Service、Biz、Dao3层.关系如下:

一个Service类调用多个Biz类,一个Biz调用多个Dao类完成业务逻辑.

基于这种情况,通常我们把事务控制到Service层.

很当然的引入Spring中配置:(其他配置略)

<property name="beanNames">
            <list>
                <value>*ServiceImpl</value>
            </list>
        </property>

 

那么,引入一个问题:如果同时对Service层和Biz层加入Spring的事务配置中,是哪一层起作用呢、?

换句话说,假设一个Service有两个Biz类,那么第一个Biz类操作成功,而第二个操作失败,此时第一个Biz是否有回滚呢。?

对应的Spring配置:

        <property name="beanNames">
            <list>
                <value>*ServiceImpl</value>
                <value>*BizImpl</value>
            </list>
        </property>

通过实验证明可得到结论:哪个包含的范围大,哪个事务起作用。

上面的假设,Service的事务起作用,第一个Biz会被回滚掉。

Spring事务属性说明

Spring事务属性配置属性说明如下:

PROPAGATION_REQUIRED

【支持当前事务,如果当前没有事务,就新建一个事务。(常用)】


PROPAGATION_SUPPORTS

【支持当前事务,如果当前没有事务,就以非事务方式执行】


PROPAGATION_MANDATORY

【支持当前事务,如果当前没有事务,就抛出异常】


PROPAGATION_REQUIRES_NEW

【新建事务,如果当前存在事务,把当前事务挂起】


PROPAGATION_NOT_SUPPORTED

【以非事务方式执行操作,如果当前存在事务,就把当前事务挂起】


PROPAGATION_NEVER   

【以非事务方式执行,如果当前存在事务,则抛出异常】


PROPAGATION_NESTED 

【如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作】


-Exception表示有Exception抛出时,事务回滚。-代表回滚+就代表提交

readonly 就是read only, 设置操作权限为只读,一般用于查询的方法,优化作用