使用注解@Transactional,进行声明式事务管理

基于@Transactional 注解进行声明式事务管理的实现步骤分为两步:

  • 启用声明式事务管理,在配置类上添加@EnableTransactionManagement,新版本中也可不添加(例如新版Spring Boot项目)。
  • 将@Transactional 注解添加到合适的业务类或方法上,并设置合适的属性信息。
    代码示例:
@Transactional(timeout = 30,
               readOnly = false,
               isolation = Isolation.READ_COMMITTED,
               rollbackFor = Throwable.class,
               propagation = Propagation.REQUIRED)
@Service 
public class SysUserServiceImpl implements SysUserService {
@Transactional(readOnly = true)
	@Override
	public PageObject<SysUserDeptVo> findPageObjects(
			String username, Integer pageCurrent) {}
}

@Transactional注解中的属性说明,ru上面代码中:

  • timeout 事务的超时时间,默认值为-1,表示没有超时显示。如果配置了具体时间,则超过该时间限制但事务还没有完成,则自动回滚事务。
  • read-only 指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。
  • rollback-for 用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。
  • no-rollback- for 抛出 no-rollback-for 指定的异常类型,不回滚事务。
  • isolation事务的隔离级别,默认值采用 DEFAULT。

spring中事务控制过程分析
在这里插入图片描述

Spring中事务传播特性

事务传播(Propagation)特性指"不同业务(service)对象"中的事务方法之间相互调用时,事务的传播方式,如图:
在这里插入图片描述
常用的事务传播方式有如下两个:

@Transactional(propagation=Propagation.REQUIRED)

       如果没有事务创建新事务, 如果当前有事务参与当前事务, Spring 默认的事务传播行为是 PROPAGATION_REQUIRED,它适合于绝大多数的情况。假设 ServiveX#methodX() 都工作在事务环境下(即都被 Spring 事务增强了),假设程序中存在如下的调用链:
Service1#method1()->Service2#method2()->Service3#method3(),那么这 3 个服务类的 3 个方法通过 Spring 的事务传播机制都工作在同一个事务中。
在这里插入图片描述代码:

    @Transactional(propagation = Propagation.REQUIRED)
	@Override
	public List<Node> findZtreeMenuNodes() {
		return sysMenuDao.findZtreeMenuNodes();
	}
@Transactional(propagation=Propagation.REQUIRES_NEW)

与上一个不同的是,使用该注解的必须是新事物,如果有当前事务,挂起当前事务并且开启新事务:
在这里插入图片描述代码:

	@Transactional(propagation = Propagation.REQUIRES_NEW)
	@Override
	public void saveObject(SysLog entity) {
	  sysLogDao.insertObject(entity);
	}

Spring中事务管理总结:
       Spring 声明式事务是 Spring 最核心,最常用的功能。由于 Spring 通过 IOC 和 AOP 的功能非常透明地实现了声明式事务的功能。
       Spring 事务管理是基于接口代理(JDK)或动态字节码(CGLIB)技术,然后通过 AOP 实施事务增强的。
       以DataSourceTransactionManager为例,在DataSourceTransactionManager中,在事务开始的时候,会调用doBegin方法,首先会得到相对应的Connection,然后可以根据事务设置的需要,对Connection的相关属性进行配置,比如将Connection的autoCommit功能关闭等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章