Spring Boot 声明式事务管理

一、概念

声明式事务管理是基于AOP的,在Spring Boot中可以通过@Transactional注解的方式获得支持,同时需要在启动类中添加@EnableTransactionManagement注解开启事务管理,这种方式的优点是:

  1. 非侵入式,业务逻辑不受事务管理代码的污染
  2. 方法级别的事务回滚,合理划分方法的粒度可以做到符合各种业务场景的事务管理

二、特点(ACID)

  1. 原子性:同一个事务中的所有操作都是原子操作,不可分割,只要有一个操作失败则所有操作都失败
  2. 一致性:事务回滚前后,数据库中的数据是一致的
  3. 隔离性:多个事务之间是相互隔离的
  4. 永久性:事务一旦提交,对数据库的影响将会是永久的

三、Service层

给Service层中适当的方法添加@Trasactional注解,默认会在抛出Exception时触发方法中的事务回滚。
当然,@Transactional注解是可以带参数的,具体的参数列表如下:

属性 类型 描述
value String 可选的限定描述符,指定使用的事务管理器
propagation enum : Propagation 可选的事务传播行为设置
isolation enum : Isolation 可选的事务隔离级别设置
readOnly boolean 读写或只读事务,默认读写
timeout int 事务超时时间设置
rollbackFor Class数组,必须继承自Throwable 导致事务回滚的异常类数组
rollbackForClassName String : 类名数组,必须继承自Throwable 导致事务回滚的异常类名数组
noRollbackFor Class数组,必须继承自Throwable 不会导致事务回滚的异常类数组
noRollbackForClassName String : 类名数组,必须继承自Throwable 不会导致事务回滚的异常类名数组

四、示例代码

package transaction.test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@SpringBootApplication
@EnableTransactionManagement
public class TransactionApplication {
    public static void main(String[] args) {
        SpringApplication.run(TransactionApplication.class, args);
    }
}
package transaction.test.user.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import transaction.test.user.dao.UserDao;
import transaction.test.user.entity.User;
import transaction.test.user.service.UserService;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    @Override
    @Transactional
    public int create(User user) {
        userDao.insert(user);
        System.out.println(1/0);
        return 0;
    }
}

你可能感兴趣的:(Spring Boot 声明式事务管理)