Maison  >  Questions et réponses  >  le corps du texte

java - Spring事务配置在service层,传播规则为required,方法中究竟应该是调用service还是多个dao比较好?

Spring中事务配置如下:

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="delete*" propagation="REQUIRED" read-only="false" 
                   rollback-for="java.lang.Exception"/>
        <tx:method name="insert*" propagation="REQUIRED" read-only="false" 
                   rollback-for="Exception" />
        <tx:method name="update*" propagation="REQUIRED" read-only="false" 
                   rollback-for="java.lang.Exception" />
        <tx:method name="save*" propagation="REQUIRED" read-only="false" 
                   rollback-for="Exception" />
        <tx:method name="*" propagation="REQUIRED" read-only="true"/>
    <:attributes>
<:advice>

现在ServiceA中有一个方法methodA,那么在ServiceA中应该注入ServiceB,ServiceC呢,还是DaoB,DaoC,然后在methodA中去保存B,C,保证B,C同时保存成功,或同时失败!


答:

既可以单独注入service,也可以单独注入dao,关键是,spring容器的事务管理默认只截获未检查异常RuntimeException。上边配置的rollback-for="java.lang.Exception"其实不用配置。配置如下

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="delete*" propagation="REQUIRED" read-only="false"  />
        <tx:method name="insert*" propagation="REQUIRED" read-only="false"   />
        <tx:method name="update*" propagation="REQUIRED" read-only="false"   />
        <tx:method name="save*" propagation="REQUIRED" read-only="false"  />
        <tx:method name="*" propagation="REQUIRED" read-only="true"/>
    <:attributes>
<:advice>

解决方案是:

try {
   .....
}catch( CheckedException e ) {
    logger.error(e);
    throw new RuntimeException(e);
}

注意,不使用try...catch...,而在方法签名后向外抛出检查型异常的行为不可取,事务也不会回滚。

迷茫迷茫2742 Il y a quelques jours628

répondre à tous(3)je répondrai

  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:58:29

    Si vous souhaitez en savoir plus sur le mécanisme de transaction Spring, vous pouvez lire ces articles :

    1. Explication détaillée de Spring Transaction - Isolation des transactions

    2. Explication détaillée de Spring Transaction - Mode de propagation des transactions

    3. Explication détaillée de Spring Transaction - Annulation manuelle de la transaction

    4. Explication détaillée de Spring Transaction - mécanisme d'annulation de transaction lorsqu'une exception se produit

    répondre
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:58:29

    En fait, ce genre de chose se fait en fonction des besoins, et les transactions seront automatiquement fusionnées. Cependant, pour des raisons de conception, essayez d'appeler dao afin que les différents services puissent être découplés.

    répondre
    0
  • 黄舟

    黄舟2017-04-18 10:58:29

    Généralement, nous définissons les transactions dans la méthode Service, surtout s'il existe un scénario pour contrôler le comportement de propagation, alors mettre dao est différent de mettre service. Parce que dao tout doit se dérouler sous un seul grand événement, service est plus compliqué.

    répondre
    0
  • Annulerrépondre