java - Spring事务配置在service层,传播规则为required,方法中究竟应该是调用service还是多个dao比较好?
迷茫
迷茫 2017-04-18 10:56:29
0
3
617

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...捕获了检查型异常,意味着程序员自己必须要解决异常,必须知道如何解决异常。通常的做法是:将检查型的异常在catch块中重新抛出为Runtime Exception,这样Spring容器就会截获该异常,进行事务回滚处理 。如下

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

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

  • 如果代码中没有使用try抛出了未检查异常,则Spring容器会自动截获异常,进行事务回滚处理。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

membalas semua(3)
伊谢尔伦

Jika anda ingin mengetahui lebih lanjut tentang mekanisme transaksi Spring, anda boleh membaca artikel saya ini:

  1. Penjelasan terperinci tentang Transaksi Spring - Pengasingan Transaksi

  2. Penjelasan terperinci tentang Transaksi Musim Bunga - mod Penyebaran Transaksi

  3. Penjelasan terperinci tentang Transaksi Musim Bunga - Pemulangan semula transaksi secara manual

  4. Penjelasan terperinci tentang Transaksi Musim Bunga - mekanisme pemulangan transaksi apabila pengecualian berlaku

Peter_Zhu

Malah, perkara seperti ini dilakukan mengikut keperluan, dan transaksi akan digabungkan secara automatik Namun, sebagai pertimbangan reka bentuk, cuba hubungi dao supaya perkhidmatan yang berbeza dapat dipisahkan.

黄舟

Secara amnya kami mentakrifkan urus niaga dalam kaedah Service, terutamanya jika terdapat senario untuk mengawal tingkah laku penyebaran, maka meletakkan dao adalah berbeza daripada meletakkan service. Kerana dao semuanya mesti di bawah satu acara besar, service lebih rumit.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!