配置好spring事務(wù)的設(shè)置
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"
destroy-method="close" parent="abstractDataSource">
<property name="url" value="${druid.datasource.url}"/>
<property name="username" value="${druid.datasource.username}"/>
<property name="password" value="${druid.datasource.password}"/>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"/>
<!-- For fine-grain transaction, programmatic transaction -->
<bean id="transactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate"
p:transactionManager-ref="transactionManager"/>
直接在試用方法前面加上 @Transactional注解就可以使用事務(wù)的功能,當(dāng)該方法下的任意一個(gè)sql執(zhí)行報(bào)錯(cuò),整體就會(huì)回滾贯要;
因?yàn)槭聞?wù)的本質(zhì)是會(huì)監(jiān)控sql執(zhí)行時(shí)拋出來的RuntimeException,如果拋出就執(zhí)行回滾操作,當(dāng)拋出是非RuntimeException就不會(huì)回滾了湾盗;
如果想其他異常也會(huì)執(zhí)行回滾操作可以使用rollbackFor = Exception.class 參數(shù)。
例子如下:
@GetMapping("/saveTryCatch")
@Transactional( rollbackFor = Exception.class)
public void saveTryCatch() throws Exception{
int age = random.nextInt(100);
User user = new User().setAge(age).setName("name:"+age);
userService.save(user);
throw new Exception();
}
由于我們知道是根據(jù)監(jiān)控異常來的立轧,我們直接使用try-catch肯定不行,這里只要監(jiān)控到異常格粪,就會(huì)將插數(shù)據(jù)操作就會(huì)回滾躏吊;