带你读懂Spring 事务——认识事务

带你读懂Spring事务的第一篇,我们先来了解什么是事务, 使用生动的栗子帮你对事务的概念和特性进行理解

带你读懂Spring 事务——事务的传播机制(藏)

带你读懂Spring 事务——事务的隔离级别(超详细,快藏)

一、什么是事务?

事务是恢复和并发控制的基本单位,一个事务包含了声明该事务开始到声明该事务结束之间的所有操作。

举个栗子:郝大(锤子的一个朋友)向锤子转账10元钱,我们将这个操作命名为“事务A",描述如下:
1.begin transaction for 事务A;
2.从郝大账户扣除10元钱;
3.向锤子账户增加10元钱;
4.end transaction for 事务A;

我们在编程中常说的事务实际上都是对数据库的一系列操作的集合,其实在关系型数据库中一条SQL就是一个事务,但在编写一些复杂业务逻辑时,往往一条sql语句并不能满足我们的要求,这时我们就需要把一系列操作组合在一起,然后声明一个事务将这一系列操作包裹起来,这样这一系列的操作就成为了我们的一个新的事务

二、事务的ACID特性

  • 原子性:事务是一个原子操作,原子性保证了组成事务的一系列操作要么全部完成,要么完全不起作用。

郝大给锤子转账10元:郝大账户扣除10元和锤子账户增加10元,原子性保证了这两个操作,要么都完成,要么都不起作用,不会出现,操作1(郝大账户扣除10元)成功而操作2(锤子账户增加10元)失败,这样钱就凭空消失了

  • 一致性:一旦事务完成(无论成功还是失败),系统的状态都是从一个一致状态转换到另一个一致状态,不会出现中间状态。

郝大给锤子转账10元,假设郝大账户有100元,锤子账户有20元:初始状态(郝大账户100元,锤子账户50元),结束状态(郝大账户90元,锤子账户60元),无论事务成功与否,系统的状态要么维持初始状态(失败),要么转变为结束状态(成功),不会出现中间状态(eg:郝大账户90元,锤子账户50元),一致性和原子性密切相关的一个特性。

  • 隔离性:一个事务的执行不能被其他事务干扰,也就是一个事务内部的操作对并发的其他事务而言是隔离的,并发执行的各个事务之间不会相互干扰。

郝大给锤子转账10元是一个事务A,同时并发执行的张三给李四转账20元是另一个事务B,这两个事务在执行的时候是相互隔离,事务A执行的成功与否不会影响事务B,同理事务B对A也是如此。
*这时你是否会有疑惑,如果两个事务操作的是同一份数据,那么并发执行,数据岂不是乱了?*其实这个跟事务的隔离级别有关系,设置不同的事务隔离级别会改变事务的实际执行过程,在设置事务隔离级别为最高隔离级别时,当两个并发事务操作同一份数据时,在真正执行时两个事务就成串行执行了,即事务A执行完事务B才会执行,就可以避免影响数据安全的问题发生。当然如果所有的事务的隔离级别都设置为最高隔离级别就会使得所有的事务串行执行,也就会降低效率,所以事务的隔离基本设置是要因业务不同而异。关于事务隔离级别我会专门写一篇文章详细讲解,欢迎关注

  • 持久性指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,不会因为之后该事务之外的操作对其影响

郝大给锤子转账10元这个事务一旦执行成功提交后,数据库的状态就变为郝大账户90元,锤子账户60元,这个结果是持久化到数据库的,就会一直存下去,不会因为后续的其他问题导致数据变化

三、Spring事务的管理方式

在Spring中的事务主要有两种管理方式:编程式事务管理和声明式事务管理

编程式事务

编程式事务是使用TransactionTemplate或者PlatformTransactionManager来进行事务实现。

编程式事务的意思就是你在编程的时候需要在代码中显式的调用事务的处理方法。

举个栗子:郝大给锤子转账10元的操作使用编程式事务的伪代码描述如下


begin Transaction();
try{  
	郝大账户扣除10;  
	锤子账户增加10;
	commit();  //事务成功执行则提交事务
}catch(Exection e){
	rollback(); //事务执行异常,则回退
}
end Transaction();

声明式事务

声明式事务是建立在Spring AOP之上的,使用AOP对目标方法进行拦截,在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交事务或者回滚事务。

声明式事务的优点就是不需要主动在编程的代码中编写事务相关的代码方法,只需在配置文件中制定相关的事务规则声明或者通过基于@Transactional注解的方式进行事务的声明。

举个栗子:郝大给锤子转账10元的操作使用声明式事务的伪代码描述如下


//使用注解声明事务(事务的传播机制,后续文章会详细讲解和演示)
@Transactional(事务传播机制)
method(){
	郝大账户扣除10;  
	锤子账户增加10;
}

文章欢迎转载,转载请注明出处,个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片

猜你喜欢

转载自blog.csdn.net/telundusiji/article/details/106441746