【Spring】怎么配置事务?看这一篇就够了

0、什么是事务

想象一个场景,A给B转账,A的钱转出去之后发生异常B没有收到钱,A的钱少了B的钱没有多,这不就乱套了吗?

所以就引出了事务这个概念:事务是数据库操作最基本的单元,逻辑上的一组操作,这一组操作要么都执行成功,要么都失败

事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都 必须成功执行,只要有发生异常就回退到事务开始未进行操作的状态,这些操作 要么都完成,要么都取消,从而保证数据满足一致性的要求

如下这段代码,如果不添加事务管理,就会导致A的钱减少,但是B的钱没有增多,所以在Spring如何进行事务管理就显得非常重要了

public void zhuan() {
          
   
    bankDao.send();
    int i = 10 / 0;
    bankDao.receive();
}

Spring 中的事务管理分为两种形式,一种是编程式事务,一种是声明式事务.

编程式事务在项目中很少使用 , 这种方式需要注入一个事务管理对象TransactionTemplate,然后在我们代码中需要提交事务或回滚事务时自己写代码实现.

声明式事务管理建立在 AOP 基础上,本质是对方法前后进行拦截,所以声明式 事务是方法级别的。

下面来看看声明式事务是如何开启的

1、使用注解实现声明式事务管理

步骤一:在spring配置文件中声明事务管理器

<!--创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<!--注入数据源-->
    <property name="dataSource" ref="dataSource"></property>
</bean>

步骤二:在spring配置文件中,开启事务注解

<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

步骤三:在spring配置文件中开启注解扫描

<!--开始注解扫描-->
<context:component-scan base-package="com.ff"></context:component-scan>

步骤四:根据业务需求在相应位置添加注解

@Transactional

这个注解可以添加到类上面也可以添加到方法上面

如果这个注解添加到类上面,表示这个类里面所有方法都开启事务

如果这个注解添加到方法上面,表示这个方法开启事务

@Service
public class BankService {
          
   

    @Autowired
    BankDao bankDao;

    //转账的方法
    @Transactional
    public void zhuan() {
          
   
        bankDao.send();
        int i = 10 / 0;
        bankDao.receive();
    }
}

测试

public class BankServlet {
          
   

    @Test
    public void zhuan(){
          
   

        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        BankService bankService = context.getBean("bankService", BankService.class);
        bankService.zhuan();
    }
}

在执行完送钱操作后出现异常,最终双方钱数都没有发生改变,测试成功

经验分享 程序员 微信小程序 职场和发展