• [spring学习]13、声明式事务(@Transaction)


    目录

    基本介绍

    开启事务管理功能

    事务控制

    事务传播机制

    PROPAGATION_REQUIRED传播机制

    PROPAGATION_REQUIRES_NEW传播机制

    事务隔离级别

    事务超时回滚

    总结


    基本介绍

            我们可以使用spring来很容易的事务进行管理,包括事务传播机制,隔离级别,超时等待等等。只需要使用注解配置即可,十分方便。注意,使用前提是在spring配置文件中开启了事务管理的功能。


    开启事务管理功能

            我们需要在spring配置文件中配置以下内容

    1. <!--这里将一个DataSource注入到DataSourceTransactionManager中-->
    2. <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="dataSourceTransactionManager">
    3. <property name="dataSource" ref="dataSource"/>
    4. </bean>
    5. <!--开启事务管理,id为dataSourceTransactionManager这个的类会对所以的事务进行控制-->
    6. <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>

            DataSource需要自己进行配置 

    事务控制

            如果我们的方法里面要对数据库进行操作,包含了多条语句,那么我们只需要加一个@Transcation注解即可,加在方法上,那么这个方法就是一个事务了,底层使用的就是AOP。

    1. @Transactional
    2. public void buyShop(Integer pid,Integer sid, Integer mount) {
    3. float price = peopleDao.getPrice(sid);
    4. peopleDao.updateStock(sid, mount);
    5. peopleDao.updateBalance(pid, mount * price);
    6. System.out.println("购买商品成功....");
    7. }

            上面代码加了@Transaction注解,那么这个方法就是一个事务了


    事务传播机制

            上面就是spring中的事务传播机制,可以看见有很多,但是常见的就2种,就是前2种,分别是PROPAGATION_REQUIRED和PROPAGATION_REQUIRES_NEW。下面来对这2种进行解释。我们直接在@Transaction种对事务隔离级别进行配置


    PROPAGATION_REQUIRED传播机制

    1. @Transactional
    2. public void f() {
    3. f1();
    4. f2();
    5. }
    6. @Transactional(propagation = Propagation.REQUIRED)
    7. public void f1() {
    8. }
    9. @Transactional(propagation = Propagation.REQUIRED)
    10. public void f2() {
    11. }

            如果执行上面的f()方法,由于f(),f1(),f2()都是事务,f1(),f2()的事务传播机制都是PROPAGATION_REQUIRED,所以f1和f2就可以看作一个整体,即要么都执行成功,要么都不执行


    PROPAGATION_REQUIRES_NEW传播机制

    1. @Transactional
    2. public void f() {
    3. f1();
    4. f2();
    5. }
    6. @Transactional(propagation = Propagation.REQUIRES_NEW)
    7. public void f1() {
    8. }
    9. @Transactional(propagation = Propagation.REQUIRES_NEW)
    10. public void f2() {
    11. }

            如果执行上面的f()方法,由于f(),f1(),f2()都是事务,f1(),f2()的事务传播机制都是PROPAGATION_REQUIRED_NEW,所以f1和f2都是一个独立个体,即f1不会影响f2,f2也不会影响f1。就算是f1执行失败,f2也会执行


    事务隔离级别

            在spring中,我们直接在@Transaction中配置即可 


    事务超时回滚

            这个也很简单,就是事务在规定时间没有执行完,那么就直接rollback。执行时间也是在@Transaction中进行配置,单位是秒

            我们通过timeout来进行设置,如果不设置,那么这个值就是-1 

             -1就是表示使用数据库默认是超时时间


    总结

            事务主要是数据库的知识,这里就只说明了怎么使用。如果想要深入了解,那么就需要去查询数据库相关的资料了。 

  • 相关阅读:
    某网书籍信息爬虫
    【css】背景换颜色
    SpringCLoud——服务的拆分和远程调用
    Linux基本指令
    Java代码审计-Filter核心技术
    大语言模型的三阶段训练
    【RtpSeqNumOnlyRefFinder】webrtc m98: ManageFrameInternal 的帧决策过程分析
    MVCC及实现原理
    蓝桥杯跑步锻炼.c语言
    使用python中pypower进行电力潮流计算
  • 原文地址:https://blog.csdn.net/m0_51545690/article/details/125460428