springboot 声明式事物

关于事务处理机制ACID,记一下

原子、一致、隔离、持久,顾名思义不解释。

 

spring提供的事务处理接口:platformtransactionmanager,事务管理框架,名字好大。

使用@Transaction 注解声明事务(可以在类,也可以在方法上(方法会覆盖类上的注解属性))

它的属性比较重要,一般情况下不需要设置,包括

propagationtion(声明周期 默认REQUIRED 也就是说方法中调用其他方法如果出现异常,A、B方法都不会提交事物而会进行回滚操作)

isolation(隔离:默认DEFAULT 方法中即使调用其他方法也会保持事物的完整性,且方法A修改的数据在未提交前方法B不会读取到)

timeout:事物过期时间

readOnly:只读事物,默认false

rollbackFor:某个异常导致回滚

noRollbackFor:某个异常不会导致回滚

 

spingboot 会根据数据访问不同自动配置不同的访问事物实现bean(下面是源码)

@Bean
        @ConditionalOnMissingBean(PlatformTransactionManager.class)
        public DataSourceTransactionManager transactionManager(DataSourceProperties properties) {
            DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(this.dataSource);
            if (this.transactionManagerCustomizers != null) {
                this.transactionManagerCustomizers.customize(transactionManager);
            }
            return transactionManager;
        }

 

springboot 默认会自动配置事物处理接口

在使用过程中只要加上transaction注解即可

接口类

package com.duoke.demo.service;

import com.duoke.demo.bean.Person;

public interface PersonService {
    Person savePersonWithRollBack(Person person);
}

 

实现类

package com.duoke.demo.service.impl;

import com.duoke.demo.bean.Person;
import com.duoke.demo.service.IPersonRepository;
import com.duoke.demo.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class PersonServiceImpl implements PersonService {
    @Autowired
    private IPersonRepository repository;

    @Transactional(rollbackFor = IllegalArgumentException.class)
    @Override
    public Person savePersonWithRollBack(Person person) {
        Person p = repository.save(person);
        if(person.getName().equals("王消费")){
            throw new IllegalArgumentException("已存储回滚");
        }
        return p;
    }

}

控制器

    @RequestMapping("rollback")
    public Person transation(Person person){
        person.setId("xxxx");
        return personService.savePersonWithRollBack(person);
    }

 

访问rollback,如name值为指定名称则抛出异常,造成事务回滚

 

posted @ 2019-08-29 22:09  李鹏飞ONLINE  阅读(269)  评论(0编辑  收藏  举报