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等。

推荐使用编程式事务

@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();
        }
    }
}

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MyBatis支持多种语言,包括 Java、XML、SQL、JavaScript、Groovy 等。其中,Java 和 XML 是 MyBatis 主要使用的语言,用于描述数据访问层的业务逻辑。SQL 用于编写 SQL 语句,JavaScript 用于编写动态 SQL,Groovy 用于编写动态 SQL 和逻辑处理。通过支持多种语言,MyBatis 可以更加灵活地满足不同场景的需求。 ### 回答2: MyBatis 支持多种语言,包括 Java、.NET 和 PHP 等。不同的语言都有对应的 MyBatis 语言绑定工具和框架。 对于 Java 开发者来说,MyBatis 提供了 MyBatis Java 界面绑定工具,可以通过 Java 代码配置和操作数据库。Java 开发者可以使用 MyBatis 提供的注解或 XML 配置文件来进行数据库操作,灵活性很高。此外,MyBatis 还支持事务管理,可以确保数据库操作的事务性。 对于 .NET 开发者来说,MyBatis 提供了 MyBatis .NET 框架,可以通过 .NET 代码配置和操作数据库。和 Java 版本类似,.NET 版本也支持注解和 XML 配置文件,提供了相似的灵活性。.NET 版本同样支持事务管理,可以保证数据库操作的一致性和完整性。 对于 PHP 开发者来说,MyBatis 提供了 MyBatis PHP 框架,可以通过 PHP 代码配置和操作数据库。虽然语言不同,但 MyBatis PHP 框架仍然提供了类似 Java 和 .NET 版本的注解和 XML 配置文件方式来进行数据库操作。同样可以支持事务管理,确保数据库操作的正确性。 总的来说,MyBatis 提供了多种语言的支持,为开发者提供了方便和灵活的数据库操作方式。无论是 Java、.NET 还是 PHP 开发者,都可以根据自己的需求选择适合自己的 MyBatis 版本来进行数据库开发。 ### 回答3: MyBatis是一种支持多种语言的持久化框架。它最初是用Java语言开发的,因此在Java应用程序中被广泛使用。这是因为Java是一种被广泛接受的编程语言,用于开发各种应用程序,并且有一个活跃的开发社区。在Java应用程序中使用MyBatis,可以轻松地构建和管理数据库操作。 除了支持JavaMyBatis还支持其他编程语言,包括.NET、PHP等。这使得开发者可以在不同的项目中使用MyBatis,而不必担心语言的限制。例如,开发.NET应用程序的开发者可以使用MyBatis来处理数据库操作,而不必学习新的ORM框架或方式MyBatis支持多种语言的原因之一是它采用了基于XML的配置方式。这意味着开发者可以使用XML文件定义数据库操作,而不是通过编写大量的代码。XML文件可以被多种编程语言轻松解析和使用,从而实现了多种语言的支持。 此外,MyBatis还提供了一种基于注解的方式来配置数据库操作。这种方式更加简洁和灵活,适用于不同编程语言的开发者。开发者可以使用注解在代码中标记和描述数据库操作,从而方便了数据库操作的管理和使用。 总之,MyBatis是一个支持多种语言的持久化框架,可以在不同编程语言的应用程序中使用。这种多语言支持使得开发者可以根据自己的需求选择合适的语言进行开发,而不必担心数据库操作的繁琐和复杂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值