你好,在Spring的配置文件中,如果数据源的defaultAutoCommit设置为True了,那么方法中如果自己捕获了异常,事务是不会回滚的,如果没有自己捕获异常则事务会回滚,如下例
播州ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!
比如配置文件里有这么条记录:
bean id="dataSource" class="xxx"
property name="xxx" value="xxx"/
property name="xxx" value="xxx"/
property name="defaultAutoCommit" value="true" /
/bean
情况1:如果没有在程序中手动捕获异常
@Transactional(rollbackFor = { Exception.class })
public void test() throws Exception {
doDbStuff1();
doDbStuff2();//假如这个操作数据库的方法会抛出异常,现在方法doDbStuff1()对数据库的操作 会回滚。
}
情况2:如果在程序中自己捕获了异常
@Transactional(rollbackFor = { Exception.class })
public void test() {
try {
doDbStuff1();
doDbStuff2();//假如这个操作数据库的方法会抛出异常,现在方法doDbStuff1()对数据库的操作 不会回滚。
} catch (Exception e) {
e.printStackTrace();
}
}
关声明式事务的配置不懂你可以问我,希望可以帮到你
java中交易操作可以在service层做事务,要提交一起提交,或者都不提交,如果服务器挂掉,那就是没有提交成功,不会有影响,都不操作就相当于回滚
java数据库中存在事务的概念,最经典的例子的就是转账,张三给李四转账,那么首先要扣除张三的钱,然后加给李四,这整个过程不能分开操作,整个过程称为事务,那么如果现在张三扣除了钱,在转账给李四之前出现了异常,那么问题来了,现在转账动作做到一半,如果不回滚事务的话,那么就出现张三钱少了,但是李四没加钱,这是不允许的,所以出现了回滚事务的这一动作。这样好理解些么?
你测试一下就晓得了, 会回滚, 我做了测试
@Override
@Transactional(rollbackFor = Exception.class)
public void test() {
TbLog log = new TbLog();
log.setId("3");
log.setOperationContent("事物回滚测试:有回滚注解");
tbLogService.create(log);
test1();
}
private void test1(){
for (int i = 1; i 3 ; i++) {
if (i==2){
throw new RestClientException("事物回滚测试");
}
TbLog log = new TbLog();
log.setId(String.valueOf(i));
log.setOperationContent("事物回滚测试:没注解");
tbLogService.create(log);
}
}
下面这种配置了不回滚的类型就不会回滚
@Override
@Transactional(rollbackFor = Exception.class,noRollbackFor = RestClientException.class)
public void test() {
TbLog log = new TbLog();
log.setId("3");
log.setOperationContent("事物回滚测试:有回滚注解");
tbLogService.create(log);
test1();
}
private void test1(){
for (int i = 1; i 3 ; i++) {
if (i==2){
throw new RestClientException("事物回滚测试");
}
TbLog log = new TbLog();
log.setId(String.valueOf(i));
log.setOperationContent("事物回滚测试:没注解");
tbLogService.create(log);
}
}