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容器会自动截获异常,进行事务回滚处理。
Jika anda ingin mengetahui lebih lanjut tentang mekanisme transaksi Spring, anda boleh membaca artikel saya ini:
Penjelasan terperinci tentang Transaksi Spring - Pengasingan Transaksi
Penjelasan terperinci tentang Transaksi Musim Bunga - mod Penyebaran Transaksi
Penjelasan terperinci tentang Transaksi Musim Bunga - Pemulangan semula transaksi secara manual
Penjelasan terperinci tentang Transaksi Musim Bunga - mekanisme pemulangan transaksi apabila pengecualian berlaku
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 meletakkandao
adalah berbeza daripada meletakkanservice
. Keranadao
semuanya mesti di bawah satu acara besar,service
lebih rumit.