一、什么是事物?
理解事务之前,先讲一个你日常生活中最常干的事:取钱。
例如 ATM 机:用户把钱从一个银行账号转账至另一个银行账号,这种操作不能被部分完成。
如转的过程中 1卡钱被相应扣除,2卡在存中,这时机器出现故障,转账被取消。取消的同时,即要事物回滚,回到1卡原有的状态。
事务就是用来解决类似问题的。事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。
在企业级应用程序开发中,事务管理必不可少的技术,用来确保数据的完整性和一致性。
事务有四个特性:ACID
1、原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
2、一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
3、隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
4、持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。
二、配置事物管理器
第一种:在Spring Boot中,当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,框架会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager。所以我们不需要任何额外配置就可以用@Transactional注解进行事务的使用。
第二种:如果不使用第一种的话,从Spring配置入口,配置事物管理器,如下图所示:
事务的配置,就是在mybatis的基础上加上两个注解。
1、需要的注解为@EnableTransactionManagement 和@Transactional 两个,它们来自于下边这个包:
spring-tx.jar
该包其实在前边配置mybatis引入依赖时,已自动引入,就是下边这个:
所以只要上边的依赖引入进来,那事务就不需要再引入包了。
2.首先,找到你在这里插入图片描述的service实现类,加上@Transactional 注解,如果你加在类上,那该类所有的方法都会被事务管理,如果你加在方法上,那仅仅该方法符合具体的事务。当然我们一般都是加在方法上。因为一般只有增、删、改才会需要事务。
3.配置完后,spring boot启动类必须要开启事务,而开启事务用的注解就是@EnableTransactionManagement ,如下:
三、用法
@Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。
虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。
默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。
敲黑板~~喵喵~看完之后,可以点赞或者评论鼓励一下老妹 抱拳,后续会分享更多的收藏的资源或者是自己平常开发遇到的经验给大家,不好的地方还望大神们指点 抱拳,共同进步!!fighting~