1.事务的定义
事务是指数据库管理系统中的一个操作序列,这些操作要么全部成功执行,要么全部失败回滚。事务的目的是确保数据库的一致性和可靠性,即在多个操作同时进行时,要么全部成功,要么全部失败,不会出现部分操作成功,部分操作失败的情况。事务通常包括开始、提交和回滚三个步骤,开始表示事务的开始,提交表示事务的成功执行,回滚表示事务的失败执行。
2.定义事务管理器
在Spring的配置类中,定义一个事务管理器
事务是对数据库的操作,所以事务的对象要得到所要操作数据库的数据源,通过注解的方式,把数据源作为参数传递给事务管理器,最后,在事务管理器方法的上方加上@Bean 注解,把返回的对象加入容器中管理
3.转账案例
通过一个银行转账的案例来理解事务的作用,假设,银行中有两个账户,分别是A和B,现在要实现A账户向B账户转钱,如果一切正常的情况下,应该是A账户的钱减少,B账户的钱增加。但是如果在转账的时候,系统出现错误,则转账失败,这时候A账户和B账户的钱都应该不变
1.定义转账方法
在数据层的Dao接口中,定义两个转账方法,分别表示进钱和出钱
2.调用转账方法
在业务层接口定义一个方法,用来调用数据层的两个转账方法
该方法的三个参数分别是A账户的名字,B账户的名字,和两个账户之间的转账金额
在该接口的实现类中调用数据层接口的两个转账方法
先自动注入数据层接口的对象,然后通过该对象调用数据层接口的方法
由上述两个图片可知,业务层接口中的 transfer() 方法里面调用了两个转账方法,所以这两个转账方法要么都执行成功,则转账成功;要么都执行失败,则转账失败;不能出现一个成功一个失败的情况,即一个账户出钱成功,另一个账户进钱失败。所以两个转账方法必须保持一致性
所以在业务层接口中的 transfer() 方法上方加上@Transactional 注解,该注解的作用是要求 transfer() 方法内执行的所有方法都必须保持一致性,即要么全部成功,要么全部失败。
同时,在Spring的配置类中,要开启事务注解
这样,对于添加了@Transactional 注解的方法,如果该方法在执行中出现了异常,则该方法中调用的所有方法都失败
4.事务的回滚
1.回滚的定义
事务的回滚是指在数据库管理系统中,当一个事务执行过程中发生错误或者异常,导致事务无法继续执行或者执行结果不符合预期时,系统会将事务中已经执行的操作全部撤销,恢复到事务开始之前的状态,以保证数据的一致性和完整性。这样可以避免因为错误操作导致数据损坏或者不一致的情况发生。回滚操作通常由数据库管理系统自动执行,也可以通过编程语言或者数据库管理工具手动触发。
2.手动添加回滚
在@Transactional 注解的后面加上“rollbackFor" ,表示遇到的异常类型,然后在后面加上需要处理的各种异常类型,这样,只要在方法的执行过程中,遇到所手动添加的异常时,程序就会回滚
5.事务的传播性
上述讲了只要在方法的上方加上@Transactional 注解,则该方法里面调用的所有方法都保持一致性,要么全成功,要么全失败。如果现在想要其中一个方法不与其他的方法保持一致,就是相当于把其中某一个方法隔离出来,当其他方法都执行失败时,被隔离出来的方法依然能执行成功
在想要隔离的方法上方的@Transactional 注解后面加上这一句话,这表示该方法要单独开一个事务,不与其他的方法共用一个事务,这样,就算该方法和其他方法一起加入到某个事务中,其他方法的失败也不会影响该方法的执行