当前位置:   article > 正文

MySQL数据库事务的四种隔离级别_mysql中的事务隔离级别

mysql中的事务隔离级别

文章目录


事务的ACID特性

事务是一个最小的不可在分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,A转给B50元,A账户-50,B账户+50整个业务流程是一个事务)

  • 原子性(Atomicity):数据库事务的不可再分的原则即为原子性。要么全部执行,要么全部取消,执行过程中任何一个元素失败则进行回滚。
  • 一致性(Consistency):在事务前/后应保持一致。如果用户A和用户B的账户余额之和是5000,无论他们如何转账,事务结束后,两个账户的余额之和仍然应该是5000。
  • 隔离性(Isolation):某个事务的操作对其他事务不可见的,一个事务的执行不应该受到其他并发事务的影响。
  • 持久性(Durability):一旦事务被提交,它对数据库的更改应该是永久性的。

事务的用法

建表的时候,选择 Innodb引擎才支持事务

开启事务(start transaction)

执行sql操作(普通sql操作)

提交/回滚(commit/rollback)

#开启手动处理事务模式
#set autocommit = false;
#开始事务(推荐)
start transaction;
#查看当前表的数据
select * from t_stu_detail;
#删除整张表的数据
delete from t_stu_detail;
#查询该表数据,发现显示删除后的结果
select * from t_stu_detail;
#回滚
rollback
#查看当前表的数据,发现又回来了
select * from t_stu_detail;
#删除整张表的数据
delete from t_stu_detail;
#提交事务
commit;
#查看当前表的数据,发现真删除了
select * from t_stu_detail;


四种隔离级别

对于同时运行的多个事务(多线程并发), 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题: (问题的本质就是线程安全问题,共享数据的问题)

1、脏读

        脏读是指在一个事务处理过程里读取了另一个未提交事务中的数据。

        例如A转给B50元,在执行到A账户增加时,B查看账户发现确实多出了50元。如果该事务执行失败进行回滚,最终B查看会发现账户里的钱并没有增加。

  1. update account set money=money+50 where name=’B’; (此时A通知B)
  2. update account set money=money-50 where name=’A’;

2、不可重复读

        事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。不可重复读主要是针对某条数据的UPDATE操作。

  1. 事务1
  2. select account where name='B'(此时事务2修改并提交了B)
  3. select account where name='B'(此时获取的account和第一次获取到的值不相同)
  4. 事务2
  5. update account set money=money+50 where name=’B’;

3、幻读 

        事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。幻读主要是对应INSERT操作,事务读第一次取到的数据比后来读取到数据条目不一致。

隔离级别

Read uncommitted (读未提交)

 就是一个事务可以读取另一个未提交事务的数据,也就是发生了脏读

 Read committed (读已提交):可避免脏读的发生。

 一个事务要等另一个事务提交后才能读取数据,可以避免脏读,但是不能避免不可重复度、幻读。

  Repeatable read (可重复读):可避免脏读、不可重复读的发生。*MySQL默认隔离级别

 重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。

分析:重复读可以解决不可重复读问题,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作

 Serializable (序列化):可避免脏读、不可重复读、幻读的发生。

Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。 

参考:

最易懂的数据库事务的四种隔离级别知识 - 知乎

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号