SprinBoot +MyBatis + MySQL8 启用数据库事务回滚解析

熊孩纸 阅读:209 2021-03-31 18:14:39 评论:0

本文参考借鉴:https://zhuanlan.zhihu.com/p/64489012

学习目录:

第一:认识数据库事务

第二:SpringBoot + MyBatis+MySQL8 如何启动数据库事务

 

1、什么是数据库事务

           1.1 为什么需要数据库事务

                          银行转账是常见的生活操作,比如张三向李四的账户转账100元这个操作,从用户的角度看是单一操作,但是从系统研发人员的角度上来看时是二个操作:

                           1、张三的账户金额减少100元。

                           2、李四的账户金额增加100元。

                         但是如果张三进行转账时,发送如下这种特殊情况:第一步张三的账户金额减少了100元,但执行第二步为李四账户添加金额时,银行交易系统发生故障导致李四的账户没有增加100元。这种情况就是我们今天将要讨论的数据库事务回滚。

                1.2 什么是数据库事务

                          语法格式

begin transaction // 开启事务 
业务逻辑SQL 
commint /rollback // 事务提交/ 事务回滚

                        事务相关定义解释

1、数据库事务可以包含一个或多个数据库操作,但这些操作构成一个逻辑上的整体。
2、构成逻辑整体的这些数据库操作,要么全部执行成功,要么全部不执行。
3、构成事务的所有操作,要么全都对数据库产生影响,要么全都不产生影响,即不管事务是否执行成功,数据库总能保持一致性状态。
4、以上即使在数据库出现故障以及并发事务存在的情况下依然成立。

 

                    1.3 事务ACID特性及其实现原理

原子性(Atomicity):事务中的所有操作作为一个整体像原子一样不可分割,要么全部成功,要么全部失败。


一致性(Consistency):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态。
一致性状态是指:
系统的状态满足数据的完整性约束(主码,参照完整性,check约束等)
系统的状态反应数据库本应描述的现实世界的真实状态,比如转账前后两个账户的金额总和应该保持不变。


隔离性(Isolation):并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。
比如多个用户同时往一个账户转账,最后账户的结果应该和他们按先后次序转账的结果一样。

持久性(Durability):事务一旦提交,其对数据库的更新就是持久的。任何事务或系统故障都不会导致数据丢失。

在事务的ACID特性中,C即一致性是事务的根本追求,而对数据一致性的破坏主要来自两个方面:
事务的并发执行
事务故障或系统故障

数据库系统是通过并发控制技术和日志恢复技术来避免这种情况发生的。
并发控制技术保证了事务的隔离性,使数据库的一致性状态不会因为并发执行的操作被破坏。
日志恢复技术保证了事务的原子性,使一致性状态不会因事务或系统故障被破坏。
同时使已提交的对数据库的修改不会因系统崩溃而丢失,保证了事务的持久性。

2、SpringBoot + MyBatis+MySQL8 如何启动数据库事务

SpringBoot + MyBatis 事务配置:需要添加注解(@EnableTransactionManagement + @Transactional)

2.1 [email protected] 注解,找到service实现类,[email protected] 注解,如果你加在类上,那该类所有的方法都会被事务管理,如果你加在方法上,那仅仅该方法符合具体的事务。当然我们一般都是加在方法上。因为只有增、删、改才会需要事务。

2.2 [email protected]:spring boot启动类必须要开启事务,[email protected],代码如下:

package com.zzg; 
 
import org.mybatis.spring.annotation.MapperScan; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 
 
@SpringBootApplication 
@EnableTransactionManagement //开启事务管理器 
@MapperScan("com.zzg.mapper") 
public class Application { 
 
	public static void main(String[] args) { 
		// TODO Auto-generated method stub 
		SpringApplication.run(Application.class, args); 
	} 
 
} 

 

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
排行榜
KIKK导航

KIKK导航

关注我们