MySQL事务隔离级别

目录

1、事务的特性

1.1原子性(Atomicity)

1.2一致性(Consistent)

1.3隔离性(Isolate)

1.4持久性(Durable)

2、事务并发的影响

2.1脏读

2.2不可重复读

2.2.1修改

2.3幻读

2.3.1新增

2.3.2删除

3、事务的隔离级别

3.1读未提交(Read uncommitted)

3.2读已提交(Read committed)

3.3可重复读(Repeatable read)

3.4串行化(Serializable)


1、事务的特性

1.1原子性(Atomicity)

同一个事务中的sql,要不全部执行,要么全部不执行,最经典的例子是转账,A转给B,A少钱,B加钱,缺一不可。

1.2一致性(Consistent)

系统从一个正确状态迁移到另一个正确的状态,依赖于开发者决定的状态,比如一支交易从处理中转为成功。

1.3隔离性(Isolate)

不同事务之间如果没有隔离性会造成数据的脏读、幻读、不可重复读等。

1.4持久性(Durable)

执行完事务后对数据完成修改后是永久性的,事务在未执行完成的时候可以有回滚。

2、事务并发的影响

2.1脏读

假如存在事务A和事务B,事务A将张三的年龄从20周岁改为了22周岁,此时事务B查询到了张三为22周岁则把张三标记为 “满足结婚年龄” 的状态,这时,事务A由于异常原因进行了事务的回滚变成了20周岁,但此时事务B已经执行完成,事务B正是由于数据的脏读而改变了一个不该改变的状态。

2.2不可重复读

2.2.1修改

假如存在事务A和事务B,事务A第一次读取张三的年龄为20周岁,此时事务B将张三的年龄从20周岁改成了22周岁,事务A进行第二次查询的时候查询的结果是22周岁,重复读取数据前后不一样。

2.3幻读

2.3.1新增

假如存在事务A和事务B,数据库表中只存在张三一个人的数据,主键id为 “1”,事务A第一次进行查询的时候发现id为“2”的数据不存在,此时事务B插入了一条id为“2”的数据,事务A进行第二次查询的时候发现id为 “2” 的数据存在。

2.3.2删除

假如存在事务A和事务B,数据库表中只存在张三一个人的数据,主键id为 “1”,事务A第一次进行查询的时候发现id为“1”的数据存在,此时事务B将id为“1”的数据删除,事务A进行第二次查询的时候发现id为 “1” 的数据不存在了。

以上两种都是幻读。

3、事务的隔离级别

事务的隔离级别有4种,例子可以查看事务并发的影响

3.1读未提交(Read uncommitted)

未提交的事务之前可以相互读取。

可造成的影响:脏读、不可重复读、脏读。

(1)脏读:由事务的回滚造成,可查看2.1脏读的例子。

(2)不可重复读:两次数据读取数据值不一致,可查看2.2不可重复读的例子。

(3)幻读:两次数据读取数据记录数不一致,可查看2.3幻读的例子。

3.2读已提交(Read committed)

只能读取已经提交后的事务,该隔离级别解决了脏读的影响。

可造成的影响:不可重复度、幻读。

不可重复读:两次数据读取数据值不一致,可查看2.2不可重复读的例子。

幻读:两次数据读取数据记录数不一致,可查看2.3幻读的例子。

3.3可重复读(Repeatable read)

又称RR读,假设存在事务A和事务B,事务A将会根据事务ID查到数据 “1”,即使此时事务B对该数据进行了新增或者删除操作也不会影响事务A的查询,解决了不可重复读的影响,但是还会出现幻读。

可造成的影响:幻读。

幻读:两次数据读取数据记录数不一致,可查看2.3幻读的例子,在这里强调一下幻读和不可重复读的区别,一个是数据数值不一样,一个是数据记录数不一样。

3.4串行化(Serializable)

数据库最高的隔离级别,该隔离级别事务串行化执行,解决了脏读、不可重复读、幻读的影响。

表1-1展示了数据隔离级别所造成的影响:

表1-1 数据隔离级别造成影响
数据库隔离级别脏读不可重复读幻读
读已提交
读未提交
可重复读
串行化  

          

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值