Mybatis 使用事务的多种方式

这篇具有很好参考价值的文章主要介绍了Mybatis 使用事务的多种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、@Transactional注解 声明式事务

        声明式事务对代码没有侵入性,方法内只需要写业务逻辑就可以了,帮助我们节省了很多代码,他会自动帮我们进行事务的开启、提交以及回滚等操作,把程序员从事务管理中解放出来。可以说优点很明显,但是这种方式的缺点也很明

	// 默认是RuntimeException就回滚,传播机制为请求事务,REQUIRED
	@Transactional(rollbackFor = RollBackException.class,propagation = Propagation.REQUIRED)
	public Boolean execute(){
		try {
		//	代码
		} catch (Exception e) {
			log.error("xxxxxx",e);
			//回滚方式一:手动回滚
			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
			//回滚方式二:抛异常
			// throw new RollBackException("发生异常了肿么办!!!");
		}
		return true;
	}

问题一:声明式事务的粒度问题

        声明式事务有一个局限,那就是他的最小粒度要作用在方法上。也就是说,如果想要给一部分代码块增加事务的话,那就需要把这个部分代码块单独独立出来作为一个方法,在大事务耗时过长需要高并发优化的情况下不建议使用声明式事务,建议采用上面提到的编程式事务方式

问题二:声明式事务用不对在某些场景下容易失效

  1. @Transactional 应用在非 public 修饰的方法上,Transactional将会失效,当用在protected、private 修饰的方法上使用 @Transactional 注解,虽然事务无效,但不会有任何报错,这是我们很容犯错的一点。
  2. @Transactional 注解属性 propagation 设置错误。
  3. @Transactional 注解属性 rollbackFor 设置错误。
  4. 同一个类中方法调用,导致@Transactional失效。
  5. 异常被你的 catch“吃了”导致@Transactional失效。

总结:@Transactional 注解的看似简单易用,但如果对它的用法一知半解,还是会踩到很多坑的。

二、DataSourceTransactionManager 编程式事务

Spring的事务处理中,通用的事务处理流程是由抽象事务管理器AbstractPlatformTransactionManager来提供的,而具体的底层事务处理实现,由PlatformTransactionManager的具体实现类来实现,如 DataSourceTransactionManager 、JtaTransactionManager和 HibernateTransactionManager等。

推荐使用编程式事务文章来源地址https://www.toymoban.com/news/detail-478319.html

@Service
public class Test {
    @Autowired
    private DataSourceTransactionManager dataSourceTransactionManager;

    @Autowired
    private TransactionDefinition transactionDefinition;

    @Autowired
    private IotSensorTypeMapper typeMapper;
    @Autowired
    private IotGatewayDoMapper doMapper;

    public void test11(){
        //方式一:使用默认bean对象TransactionDefinition
        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
        //方式二:自己创建,可以设置事务传播机制,但一般都是使用默认即可PROPAGATION_REQUIRED。
        // DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        // def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        //transactionStatus = dataSourceTransactionManager.getTransaction(def);
        // 代码逻辑 ..
        try {

            IotGatewayDo iotGatewayDo = new IotGatewayDo();
            iotGatewayDo.setGatewayId(1L);
            iotGatewayDo.setName("cccc");
            iotGatewayDo.setStationNumber(1);
            doMapper.insertIotGatewayDo(iotGatewayDo);

            IotSensorType sensorType = new IotSensorType();
            sensorType.setUnit("ww");
            sensorType.setName("222");
            sensorType.setK(1.0f);
            sensorType.setB(0f);
            sensorType.setPoint(1);
            typeMapper.insertIotSensorType(sensorType);

            dataSourceTransactionManager.commit(transactionStatus); // 手动提交
        } catch (Exception e) {
            System.out.println("异常——————————————————");
            dataSourceTransactionManager.rollback(transactionStatus); // 事务回滚
            e.printStackTrace();
        }
    }
}

到了这里,关于Mybatis 使用事务的多种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring @Transactional注解事务传播机制propagation参数说明

    在SpringBoot项目中,我们通常使用 @Transactional 去进行事务控制,而 @Transactional 注解中,有个比较关键的属性就是 propagation 。在一个 多事务 的环境中,一个事务方法调用另一个事务方法时,就会涉及到事务的传播行为,该属性用来控制一段代码经过多个 @Transactional 注解生效(

    2024年02月11日
    浏览(43)
  • Spring 声明式事务讲解,和 @Transactional注解的用法

    目录 一、Spring框架介绍 二、什么是声明式事务 三、如何解决并发性事务问题 四、@Transactional注解的用法 Spring框架是一个开源的Java应用程序开发框架,旨在简化企业级Java应用程序的开发。它提供了一种轻量级的、全面的编程和配置模型,可以帮助开发人员构建可扩展、模块

    2024年01月25日
    浏览(52)
  • 面试好题:@Transactional声明式事务注解什么时候会失效?

    今天来分享一道比较有意思的面试题,“@Transactional声明式事务注解什么时候会失效?”。 对于这个问题,我们一起看看考察点和比较好的回答吧!     这个问题就是面试官想考察我们对@Transactional注解有没有深刻的认识,以及日常开发中是否善于积累,认真思考。 下面我

    2024年02月09日
    浏览(38)
  • MyBatis-Plus 超详细笔记|配置使用|多种查询|常用注解

    Mybatis-Plus可以节省大量时间,所有的CRUD代码都可以自动化完成。 MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。其在 MyBatis 的基础上提供了很多方便的 CRUD 操作、分页查询、逻辑删除、自动填充等功能。 在Maven项目中,

    2024年02月05日
    浏览(48)
  • Spring使用@Transactional 管理事务,Java事务详解。

    B站视频:https://www.bilibili.com/video/BV1eV411u7cg 技术文档:https://d9bp4nr5ye.feishu.cn/wiki/HX50wdHFyiFoLrkfEAAcTBdinvh 简单来说事务就是一组对数据库的操作 要么都成功,要么都失败。 事务要保证可靠性,必须具备四个特性:ACID。 A:原子性:事务是一个原子操作单元,要么完全执行,要么

    2024年02月11日
    浏览(31)
  • @Transactional 注解使用详解

    @Transactional 的作用范围 方法 :推荐将注解使用于方法上,不过需要注意的是: 该注解只能应用到 public 方法上,否则不生效。 类 :如果这个注解使用在类上的话,表明该注解对该类中所有的 public 方法都生效。 接口 :不推荐在接口上使用。 @Transactional 的常用配置参数总结

    2023年04月11日
    浏览(71)
  • Spring 声明式事务 @Transactional(基本使用)

            声明式事务的实现很简单,只需要在需要事务的⽅法上添加 @Transactional 注解就可以实现了.⽆需⼿动开启事务和提交事务,进⼊⽅法时⾃动开启事务,⽅法执⾏完会⾃动提交事务,如果中途发⽣了 没有处理的异常会⾃动回滚事务.         废话不多说,直接看代码实现,

    2024年01月23日
    浏览(50)
  • Spring 事务的使用、隔离级别、@Transactional的使用

            Spring事务是Spring框架提供的一种机制,用于管理应用程序中的数据库事务。         事务是一组数据库操作的执行单元,要么全部成功提交,要么全部失败回滚,保证数据的一致性和完整性。 Spring事务提供了声明式事务和编程式事务两种方式: 编程式事务:

    2024年02月15日
    浏览(46)
  • 【JavaEE】Spring事务-事务的基本介绍-事务的实现-@Transactional基本介绍和使用

    【JavaEE】Spring 事务(1) 比如跟钱相关的两个操作: 第一步操作:小马卡里 - 100元 第二步操作:老马卡里 + 100元 这就是一个事务,捆在一起的一组行为,就是事务 而它能保证的是,这个行为的原子性,一致性,隔离性,持久性: 两个操作都成功 两个操作都失败 要么一起成

    2024年02月11日
    浏览(43)
  • 【SpringBoot】89、SpringBoot中使用@Transactional进行事务管理

    事务是一组组合成逻辑工作单元的操作,虽然系统中可能会出错,但事务将控制和维护事务中每个操作的一致性和完整性。 1、SpringBoot 引用说明 新建的 Spring Boot 项目中,一般都会引用 spring-boot-starter 或者 spring-boot-starter-web,而这两个起步依赖中都已经包含了对于 spring-boot

    2024年02月12日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包