目录
一.事物的概念
二.为什么需要事物
三.事物的执行机制
四.MySQL的事物基本使用
五.事物的ACID特性
5.1一致性
六 事物的隔离级别
6.1事物隔离的原因及解决思路
6.2MySQL事物的隔离级别
个人主页:tq02的博客_CSDN博客-C语言,Java,Java数据结构领域博主
本文由 tq02 原创,首发于 CSDN
本章讲解内容:MySQL的事物讲解欢迎各位→点赞 + 收藏⭐ + 评论+关注✨
学习专栏: C语言 JavaSE MySQL基础
在MySQL中,数据库事物支持是在引擎层实现的,我们知道,MySQL是一个支持多引擎的系统,但不是所有的引擎都支持事物,比如MySQL原生的MyISAM引擎就不支持事物,这也是MyISAM被InnoDB代替的重要原因之一。在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
数据库的事务(Transaction): 指一系列数据库操作作为一个逻辑单元执行的过程。事务可以确保数据库中的数据一致性和完整性。
本质:将多个操作打包为1个操作来完成,要么成功,要么失败。
事物的优点:可以确保数据库操作的可靠性,并提高数据的安全性和可靠性。
在现实生活当中,我们经常会有转账的行为,假设:张三给李四转账1000元。而其实会有很多种问题产生,导致转账不成功。例如:
而把这种转账行为当作数据库的执行语句来看,很明显会出现巨大的问题,因此为了解决问题:提出了 事物 来控制,保证要么执行失败,要么执行成功。
我们先假设事物有3个操作,分别为操作1、操作2、操作3.在事物执行之前,我们无法判断是哪步操作会有故障,但是执行时发生故障时,会主动将前面的操作进行还原,也称回滚操作
回滚的实现:通过特定的日志,将事物中的每一个操作记录下来,一旦需要回滚,按照日志将之前的操作进行“逆操作”来执行。
逆操作:若上一个操作是插入,逆操作就是删除、若上一个操作是删除,逆操作就是插入。
因此事物利用 原子性 通过回滚操作从日志中进行逆操作
先准备一个测试表:
create table test(
id int primary key auto_increment,
name varchar(20),
sex varchar(20) );
现在进行事物的操作:
注:rollback即是全部失败,commit即是全部成功
代码操作:
mysql> start transaction;
mysql> insert into test(name,adress) values('tq02','男');
mysql> update text set sex='女' where name = 'tq01';
mysql>commit;
事物具有四个特性,通常被称为ACID特性:
原子性(Atomicity):事务中的操作要么全部成功执行,要么全部失败回滚。如果其中任何一个操作失败,整个事务将被回滚到初始状态。
一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。即,事务执行前后数据库的状态是一致的。
隔离性(Isolation):并发执行的多个事务之间是相互隔离的,每个事务对其他事务的操作是不可见的,直到事务提交。
持久性(Durability):一旦事务提交成功,其对数据库的修改将永久保存,即使发生系统故障也不会丢失。
事物追求的根本是一致性,而破坏一致性主要来源于两个方面,事物的并发执行和事物故障或者系统故障。
事物的并发操作:两个或多个sql语句同时执行。
例如:一边查找张三的工资条、另一边让张三的工资提高500,那么查找出来的是张三涨还是没涨的工资呢?这就是使数据不存在一致性。
事物故障和系统故障:操作发生错误,通过回滚的方式回复。
结:
当多个用户同时访问数据库时(并发操作),每个事务的操作可能相互干扰,从而导致数据的混乱和不一致,而导致数据的混乱和不一致有3种原因:脏读、不可重复读、幻读
脏读(Dirty Read)问题:脏读是指一个事务在读取另一个事务未提交的数据时,导致数据不一致。。
抽象解释:当我在考试的时候,隔壁的人偷看了我的选择题答案,但是我在交卷前修改了,导致他读取我的答案时出错
解决方案:在事物未提交数据前加锁,防止其它事物读取,简称:写数据加锁。
不可重复读(Non-repeatable Read)问题:不可重复读是指在同一个事务中多次读取同一数据,但得到的结果却不一致。
抽象解释:当我在考试的时候,隔壁的人想偷看了我的选择题答案时,我立马修改答案,就无法读取我原来的答案了。
解决方案:事物读取也加锁,就是指其它事物无法更改数据。简称:读数据加锁
幻读(Phantom Read)问题:幻读是指一个事务在读取到某个范围内的数据后,另一个事务插入了新的数据,导致第一个事务再次读取时,发现有新增的数据。
抽象解释:当我在考试的时候,隔壁的人看我的选择题答案时,我不会修改选择题答案,但是我依然在写填空题答案,并且他也看得到我填空题答案。
解决方案:串行化,彻底放弃并发执行,所有事物变为一个一个顺序执行。
脏读--------->不可重复读--------->幻读,事务的隔离性在不断提高,但是并行不断降低。
注:并发控制就是有脏读、不可重复读、幻读的问题。
MySQL数据库为了解决以上的问题,提出了4种事物隔离级别。分别为:read uncommitted、readcommitted、repeatable read、serializble
1.read uncommitted
允许读未提交的数据,也就是一个事物可读取另一个事物未提交的数据,因此会发生脏读、不可重复读、幻读的情况。隔离性低,数据可靠性最低,并发程度最高。
2.read committed
允许读取已经提交的数据,讲解了脏读的问题,给写操作加锁,但依然存在不可重复读和幻读的问题,隔离性提高了,并发程度降低,数据可靠性提高。
3repeatable read
可以重复读取数据(写操作和读操作都加锁),讲解了脏读和不可重复读的问题,但是存在幻读的问题,隔离性又提高了,数据可靠性提高,并发性降低了。
4serializable
事物彻底的变成了串行执行,解决了脏读、不可重复读、幻读的问题,隔离性最高,但是同样放弃了并发操作,数据可靠,效率也最低。
注:由于不同的隔离级别,拥有不同的特性,因此在实际操作里,我们需要根据实际需求场景类决定使用哪个隔离级别。
事物的注意点:需要知道为什么需要事物?事物的作用是什么?事物隔离的原因及其作用?
· ----------懒惰的tq02