MySQL专题Day(1)————事务
博主开新坑啦,主要是从细致的角度为了和各位一起学习分享后端知识,当然AI面经也将尽快更新。下面的知识为博主学习笔记,笔记知识来源参考视频教程(对应的事务有关章节):51. 基础-事务-简介_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1Kr4y1i7ru?spm_id_from=333.788.videopod.episodes&vd_source=7276e08eb5d2cd9036ee79547df6412d&p=51
目录
事务定义💡
MySQL中手动提交事务的步骤🔧
方法一
方法二
事务四大基本属性(ACID)🏆
并发事务引发的问题——(这里将详细讲清楚脏读、不可重复读、幻读)🚨
脏读🧹
定义:一个事务读取到另一个事务还没有提交的数据。
例子(“我改了,我没交,但是你却已经可以看见了”)
不可重复读🔄
定义:一个事务先后读取同一条记录,但是两次读取数据都不同。
例子(“我查了一次,但查的同时你交了,再查发现结果和前一次不同了”)
幻读 👻
定义:在隔离级别解决了不可重复读的问题前提下,一个事务按照条件查询数据时,没有对应的数据行,但是在插入的数据的时候发现已经存在相应的数据行了。就像出现了幻影数据一般。
例子(解决不可重复读后,我查了一次没有相应数据,但想插入,却发现又存在对应的数据行了。就像是数据隐形了一般!!!)
事务的隔离级别——解决事务并发问题🛡️
查看事务的隔离级别🔍
读未提交
读已提交(Oracle默认隔离级别)
可重复读(MySQL默认隔离级别)
串行化⚠️
知识复习导图
事务定义💡
一组操作的逻辑集合,是一个不可分割的工作单位。事务会将所有操作视作是一个整体,一起向系统提交或者撤销。即:这组操作要么同时成功,要么同时失败。
Tips:在MySQL数据中默认将一条DML语句当作隐式提交事务。
MySQL中手动提交事务的步骤🔧
这里各位可以采用一些带有GUI的连接工具(Sqlyog、Navicat或者是MySQL自带的连接操作GUI界面)或者直接终端操作MySQL,这里本质是在一个连接会话中进行操作。
方法一
1.首先查询 @@autocommit值是否为1
select @@autocommit
2.将其更新设置为0。(表示关闭自动提交)
set @@autocommit = 0
3.选中要执行的单个SQL或者一组逻辑集合,执行。
4.执行完毕后,一定要额外加上commit;如果出现异常则直接进行回滚即可。Rollback。
--提交 COMMIT; --回滚 ROLLBACK;
方法二
1.在需要开启事务的地方编写start transaction或者begin
2.编写相应SQL操作语句——逻辑代码
3.需要结束的地方直接加上commit 或者 rollback
--COMMIT代码 --表示事务开始 也可以用BEGIN替代 START TANSACTION;--DO SOMETHING--提交事务 COMMIT;
--回滚的代码 --表示事务开始 也可以用BEGIN替代 START TANSACTION;--DO SOMETHING--回滚 ROLLBACK;
⚠️值得注意的是:如果在出现异常的情况下,仍然采用COMMIT,则会将执行成功的SQL提交,失去了事务同生共死的属性,也就是说这个逻辑集合本质就失去了称为事务的资格。因此,在正常业务中如果出现异常,一定采用回滚操作!
事务四大基本属性(ACID)🏆
原子性(Atomic):事务是不可分割的单元,要么全部成功,要么全部失败。
一致性(Consistency):事务完成的时候,必须使得所有数据状态保持一致。
隔离性(Isolation):数据库可提供的事务隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性(Durability):事务一旦提交或者回滚,其对于数据库的影响就是永久性的。
并发事务引发的问题——(这里将详细讲清楚脏读、不可重复读、幻读)🚨
脏读🧹
定义:一个事务读取到另一个事务还没有提交的数据。
例子(“我改了,我没交,但是你却已经可以看见了”)
两个并发事务A和B,B先对数据库表id = 1数据进行修改,但还未提交,A进行查询就查询到了B还没有提交修改后的数据了。
不可重复读🔄
定义:一个事务先后读取同一条记录,但是两次读取数据都不同。
例子(“我查了一次,但查的同时你交了,再查发现结果和前一次不同了”)
两个并发事务A和B,A先查询了一条id=1数据,另外并发的事务B将id = 1这条数据修改后,然后A再次查询查询到了B修改后的值。
幻读 👻
定义:在隔离级别解决了不可重复读的问题前提下,一个事务按照条件查询数据时,没有对应的数据行,但是在插入的数据的时候发现已经存在相应的数据行了。就像出现了幻影数据一般。
例子(解决不可重复读后,我查了一次没有相应数据,但想插入,却发现又存在对应的数据行了。就像是数据隐形了一般!!!)
两个并发事务,A和B,A首先做一次查询操作查找ID为1的数据记录,发现并没有ID为1的记录,此时,B先于A插入提交了一条ID为1的记录,但是A的下一步操作也是希望插入ID为1的记录,但此时却无法插入,因为A不知道B已经向其中插入了一条Id为1的记录了,于是A再次查询,发现仍然没有相应ID为1的记录。好像有幻影数据存在!!
事务的隔离级别——解决事务并发问题🛡️
查看事务的隔离级别🔍
SELECT @@TRANSACTION_ISOLATION
读未提交
- 不解决任并发问题。🚫
--设置方法 SET SESSION/GLOBAL TASACTION LEVEL READ UNCOMMITED
读已提交(Oracle默认隔离级别)
解决脏读问题✅
--设置方法 SET SESSION/GLOBAL TASACTION LEVEL READ COMMITED
可重复读(MySQL默认隔离级别)
解决不可重复读 + 脏读,但无法解决幻读🔄
--设置方法 SET SESSION/GLOBAL TASACTION LEVEL REPEATABLE READ
串行化⚠️
解决幻读问题,牺牲了所有并发性能。(不再支持事务并发)
--设置方法 SET SESSION/GLOBAL TASACTION LEVEL SERIALIZABLE
⚠️值得注意的是:当设置事务隔离级别为SERIALIZABLE后,若开启并发事务操作相同数据(如同时修改同一张表),后续事务在首次执行冲突操作(如UPDATE/DELETE)时会被阻塞。这种阻塞会持续到前一个事务完成(COMMIT或ROLLBACK),此时被阻塞的事务会根据前事务结果决定继续执行或报错。