Mysql基础篇(事务、隔离性介绍)

事务

事务就是一组原子性的SQL操作,或者说是一个独立的工作单元。在这个工作单元里任何一条语句无法执行成功,那么所有的语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部失败

例如:假设一个需求(事务),小明现在要给小王转账200元,那么需要三个步骤:
1.检查小明的账号余额是否大于200
2.从小明的账号金额中减去200
3.在小王的账号金额中加上200

上述三个步骤必须打包在一个事务内,任何一个步骤的失败,则必须回滚所有的步骤。
事务的4个特性(简称ACID):

原子性(atomicity):每个事务都必须视为一个不可再分的最小单位,要么全部成功要么全部失败。如上述列子:三个步骤中任何一个步骤的失败,都会导致全部操作失败回滚。
一致性(consistency):任何时候都必须保证数据的一致性,例如:小明账号有2500块,小王账号有2500块,他们两之间不管怎么转账,最终的总和都一定是5000.尽管转账的同时系统发生了故障,一方没有收到钱,另一方也不会丢失。
隔离性(isolation):一个事务所做的修改在最终提交之前,对其他事务是不可见的。例如在前面的例子中,当执行到第三个步骤的时候,此时有另一个转账的事务程序开始运行,则其看到的小明账号余额是还没有被减去200元的。(这个在隔离级别的时候详细介绍)
持久性(durability):一旦事务提交成功,则其所做的修改就会永久的保存到数据库中。及时体统崩溃也不会丢失数据

隔离级别

隔离性其实比想象的要复杂。在SQL标准中定义了4中隔离级别,每一种级别都规定了一个事物中所做的修改,哪些事务内和事物间是可见的。较低级别的隔离通常可以执行更高效率的并发,系统的开销也更小,但同时引发的问题也最多。
四种隔离级别分别为:
READ UNCOMMITTED(读未提交):在这个级别中事务的修改即使没有提交,对其他事务也是可见的。事务可以读取未提交的数据,这被称之为脏读(Dirty Read)(后面介绍)。这个级别会导致很多问题,性能上来讲又不会好太多,所以很少用。
READ COMMITTED(读已提交):大多数数据库的默认隔离系统都是这个(Mysql不是),这个级别就是一个事务开始的时候,只能看见已提交的事务所做的更改。换句话说就是一个事务开始的知道提交之前,对其他事务都是不可见的。这解决了脏读的问题,但同时也产生了不可重复读(Nonrepeatable Read),因为两次执行同样的查询可能得到不同的结果。
REPEATABLE READ(可重复读):该级别保证了同一个事务中多次读取同样的记录的结果是一样的,解决了不可重复读的问题。但是又无法解决一个新的问题,那就是幻读(Phantom Read)
这个可重复读是Mysql的默认隔离级别。
SERIALIZABLE(可串行化):这个是事务的最高隔离级别,它强制事务串行化操作。避免了幻读问题,但同时也是效率最低的,只有在非常需要确保数据一致性而且可以接受没有并发的情况下,才考虑采用该级别。
在这里插入图片描述

脏读?幻读?不可重复读?

脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值