我理解的---》MySQL事务的四大特性及事务的隔离级别
Posted Recently 祝祝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我理解的---》MySQL事务的四大特性及事务的隔离级别相关的知识,希望对你有一定的参考价值。
什么是事务?Transaction
常言道:能不麻烦就不麻烦,能简单化就简单化。但是为什么需要事务呢?
事务:用来保证一个业务的完整性,最大的优势就是回滚,并撤销正在进行的所有未提交的修改;作用是:事务关联业务,业务中的步骤要么成功,要么全部撤销
事务必须在innodb聚集索引下使用,myisam非聚集索引事务无效。
事务有什么特性?
特性,说到事务不得不说ACID
要是面试官问到事务,从ACID开始说起,就很能用自己的语言表述出来你所了解到的事务
在mysql下系统默认自动提交事务,单条SQL语句,数据库系统自动将其作为一个事务执行,这种事务被称为隐式事务。
手动把多条SQL语句作为一个事务执行,使用BEGIN开启一个事务,使用COMMIT提交一个事务,这种事务被称为显式事务
A:原子性:Atomicity
每个事务都是一个独立的整体,事务是最小单位,不可拆分,事务要么成功,要么回滚,不可部分成功,部分失败
什么是回滚?
事务发生回滚就是把之前所有的步骤全部撤销(这也是原理)
C:一致性:consistency
简单说就是:操作之前与操作之后都处于一致性的状态
I:隔离性:Isolation
数据库会给每个用户开启事务,但是一个事务不能被其他事物所影响,多个并发事务之间要相互隔离(并发读)
D:持久性:Durability
在事务提交时,数据的改变是永久的,即便系统故障也不会丢失。
事务的隔离性?
事务的操作,一共分为两种:读事务(select)和修改事务(insert,update),如果没有隔离性操作,多个事务可以对一个事务进行修改,最终究达不到想要的效果,回想一下要是所有人都可以修改你的事务,那岂不是你的业务项目就很危险了,安全性低。
例如:
- 两个事务对同一条事务进行修改,可能造成数据丢失
- 一个事务读取另一个事务未提价的事务,脏读
- 一个事务读取事务的同时,另一个事务正在修改此条数据,多次读取返回来不同的数据
- 一个事务在一定范围内查询,另一个事务数据进行添加或者删除操作,可以在本事务中查询到,这就出现了数据的幻读
保证事务的安全性,一个回话可操作性的级别,决定能被其他会话操作的程度。
隔离性越高,效率越低,安全性越高,读并发越低
事务的隔离级别:
UNCOMMITTED:read uncommitted—未提交读—不安全–不安全极端
未提交读:一个事务可以读取另一个事务中未提交的数据
比如你在一个公司里,老板说要不我们更改一下上班机制(事务),不在九九六了(修改),周末双休(修改),但是还没有真正提交实施(未提交),但是你听到了修改机制的这件事情(读取未提交事务),然后你周六就真的不去上班了,事后可想而知了…情况很严重
会出现的问题:脏读,不可重复读,幻读
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
COMMITTED:read committed— 提交读----Oracle默认给出的级别,数据量大
提交读:一个事务读取数据必须在另一个数据提交后。
你拿着银行卡去买单,卡里余额一万五,此时你老婆拿着拿着你的副卡跟朋友去购物,买了一个包一万五,并提交,此时你在用你的 卡买单时查询卡余额时,发现卡里没钱了。就是多个事务可以同时进行修改并提交,发生了提交读,不可重复读的机制。
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
会出现的问题:不可重复读,幻读。 不会出现:脏读
REAPTABLE: repeatable read----重复读— MYSQL默认给出的隔离级别
可重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。幻读的出现:一个事务读取不到另一个事务insert并且提交的数据,但是可以进行修改
就是你拿着卡去买单,卡里余额一万五,但是此时你老婆拿着副卡也去买单,但是此时是用不了的,因为你正在用着这张卡,你开启了事务,你老婆买单这个事务不能对卡进行操作。
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
会出现的问题:幻读。 不会出现:脏读,不可重复读,
SERIALIZABLE: serializable–串行化----锁机制–最安全的机制效率低
最高级的事务隔离,事务不相互冲突,每一个数据行都加上了共享锁,保证安全性的同时,降低了效率,适用于安全情况要求特别高的情况下,同时可能出现超时的现象和锁竞争的现象
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
不会出现:脏读,不可重复读,幻读
事务隔离性产生的问题:
脏读:
事务读取了另一个事务未提交的数据,
不可重复读:
事务A在第一次读取数据后,事务B对数据进行了修改并提交,事务A在重复读取数据时发生改变
第二次读取的数据具体内容与第一次读取的数据内容不一致,不会发生数据行数或者列数的改变
幻读
事务A在一定范围内进行查询,事务B对A查询范围的数据进行添加或者删除数据,在事务A中可以在一定范围内查询到事务B修改后的数据
第二次读取数据与第一次读取数据的不一致,发生了行数上的改变。
操作事务你需要知道的操作:
-- 查看是否为自动提交
SHOW SESSION VARIABLES LIKE 'autocommit';
-- 开启或关闭自动提交,开启为1,关闭为0
SET autocommit=1;
-- 查看自动性
select @@autocommit;
-- 查看隔离性级别
SELECT @@tx_isolation;
-- 开启事务1
begin;
--开启事务1
start transaction;
-- 事务提交
commit;
-- 事务回滚
rollback;
end》》》
今天老师说了一句话让我印象深刻:老祖宗的文化不能丢呀,你想想为什么五千年的文化可以流传这么就,就是因为他有道理呀。
道理是道理听不听的进去又是另一回事了,加油
以上是关于我理解的---》MySQL事务的四大特性及事务的隔离级别的主要内容,如果未能解决你的问题,请参考以下文章