爱分享666

当前位置:首页 >java技术博客>springBoot

@Transactional

spring 事务注解

1.简单开启事务管理

@EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />

2.事务注解详解

默认遇到throw new RuntimeException(“…”);会回滚 
需要捕获的throw new Exception(“…”);不会回滚

指定回滚

@Transactional(rollbackFor=Exception.class) 
    public void methodName() {       // 不会回滚
       throw new Exception("...");
    }

指定不回滚

@Transactional(noRollbackFor=Exception.class)    public ItimDaoImpl getItemDaoImpl() {        // 会回滚
        throw new RuntimeException("注释");
    }

如果有事务,那么加入事务,没有的话新建一个(不写的情况下)

@Transactional(propagation=Propagation.REQUIRED)

容器不为这个方法开启事务

@Transactional(propagation=Propagation.NOT_SUPPORTED)

readOnly=true只读,不能更新,删除

@Transactional (propagation = Propagation.REQUIRED,readOnly=true)

设置超时时间

@Transactional (propagation = Propagation.REQUIRED,timeout=30)

设置数据库隔离级别

@Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)

3.指定事务管理器

spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。

关于事务管理器,不管是JPA还是JDBC等都实现自接口 PlatformTransactionManager 如果你添加的是 spring-boot-starter-jdbc 依赖,框架会默认注入 DataSourceTransactionManager 实例。如果你添加的是 spring-boot-starter-data-jpa 依赖,框架会默认注入 JpaTransactionManager 实例。

你可以在启动类中添加如下方法,Debug测试,就能知道自动注入的是 PlatformTransactionManager 接口的哪个实现类。

3.1 打印项目事务管理器

@EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />@SpringBootApplicationpublic class ProfiledemoApplication {

    @Bean    public Object testBean(PlatformTransactionManager platformTransactionManager){
        System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName());        return new Object();
    }    public static void main(String[] args) {
        SpringApplication.run(ProfiledemoApplication.class, args);
    }
}

这些SpringBoot为我们自动做了,这些对我们并不透明,如果你项目做的比较大,添加的持久化依赖比较多,我们还是会选择人为的指定使用哪个事务管理器。 
代码如下:

3.2 指定事务管理器

@EnableTransactionManagement
@SpringBootApplicationpublic class ProfiledemoApplication {    // 其中 dataSource 框架会自动为我们注入    @Bean    public PlatformTransactionManager txManager(DataSource dataSource) {        return new DataSourceTransactionManager(dataSource);
    }

    @Bean    public Object testBean(PlatformTransactionManager platformTransactionManager) {
        System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName());        return new Object();
    }    public static void main(String[] args) {
        SpringApplication.run(ProfiledemoApplication.class, args);
    }
}


在Spring容器中,我们手工注解@Bean 将被优先加载,框架不会重新实例化其他的 PlatformTransactionManager 实现类。

然后在Service中,被 @Transactional 注解的方法,将支持事务。如果注解在类上,则整个类的所有方法都默认支持事务。

对于同一个工程中存在多个事务管理器要怎么处理,请看下面的实例,具体说明请看代码中的注释。

3.1 使用指定的事务管理器

@EnableTransactionManagement // 开启注解事务管理,等同于xml配置文件中的 <tx:annotation-driven />@SpringBootApplicationpublic class ProfiledemoApplication implements TransactionManagementConfigurer {

    @Resource(name="txManager2")    private PlatformTransactionManager txManager2;    // 创建事务管理器1
    @Bean(name = "txManager1")    public PlatformTransactionManager txManager(DataSource dataSource) {        return new DataSourceTransactionManager(dataSource);
    }    // 创建事务管理器2
    @Bean(name = "txManager2")    public PlatformTransactionManager txManager2(EntityManagerFactory factory) {        return new JpaTransactionManager(factory);
    }    // 实现接口 TransactionManagementConfigurer 方法,其返回值代表在拥有多个事务管理器的情况下默认使用的事务管理器    @Override    public PlatformTransactionManager annotationDrivenTransactionManager() {        return txManager2;
    }    public static void main(String[] args) {
        SpringApplication.run(ProfiledemoApplication.class, args);
    }

}

@Componentpublic class DevSendMessage implements SendMessage {    // 使用value具体指定使用哪个事务管理器
    @Transactional(value="txManager1")
    @Override    public void send() {
        System.out.println(">>>>>>>>Dev Send()<<<<<<<<");
        send2();
    }    // 在存在多个事务管理器的情况下,如果使用value具体指定    // 则默认使用方法 annotationDrivenTransactionManager() 返回的事务管理器    @Transactional    public void send2() {
        System.out.println(">>>>>>>>Dev Send2()<<<<<<<<");
    }

}


上一篇:

全网最全的 最详细的 Redis集群搭建教程图文

下一篇:

SpringBoot __ AOP注解式拦截与方法规则拦截实现事务控制

0 +1
打赏 ×

如果网站能给予您帮助,欢迎给网站捐助,给我打赏个吧!
您的支持是我的动力,让网站能一直陪伴着大家,共同学习进步。
捐助费用将用于网站日常运营(服务器租费、域名租费等)
捐助者请发送邮箱提供姓名至 zhaoqn@163.com 留言以表感谢。

网友评论


  • 验证码:

热门评论

本月热门

推荐资料

精彩评论

回到顶部