MySQL的ACID以及事务的隔离级别

一、简介

MySQL中的事务是恢复和并发的控制基本单位,因此,如何使用事务以及选择事务的隔离级别,对于mysql十分重要

二、事务的特征ACID

事务有如下四个特征,分别为原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability),简称ACID

1、原子性

原子性指的是一个事务,要么全部执行成功,要么全部不执行,像一个原子一个不可分割。如转账操作,A转给B金额100,首先A的余额-100,然后B的余额+100。转账操作要么都完成,要么都不完成。

2、一致性

一致性指的是一个事务,在事务开始执行前的状态,和事务结束之后的状态,是一致的。比如转账操作,事务开始前,A和B的余额假设总和是1000,那么A转给B金额100后,A和B的余额总和仍然是1000。

3、隔离性

隔离性指的是多个事务在执行过程中,是相互隔离的,互不影响。其中,事务的隔离级别在mysql中共有四种

4、持久性

持久性指的是事务提交完成之后,数据库对数据的保存是永久的,不会因为服务器宕机而导致数据丢失。如JDBC向数据库提交数据后,数据在数据库中必须永久保存。

三、事务出现的问题

事务是并发控制的基本单位,因此多个事务并行执行会导致一定的问题,可能产生的问题如下:

1、脏读

脏读指的是一个事务,读取了另一个事务中未提交的数据。那么,当另外的事务由于错误而回滚时,将导致第一个事务读取错误。

2、不可重复读

不可重复读指的是,一个事务中,两次读取同一个内容,但是读取到的数据却不相同。导致的原因是第二次的数据,被另一个事务修改并提交了事务。

3、幻读

幻读出现在一个非独立事务时,将可能导致发生。比如一个事务的有两个操作,第一是将所有的账户余额全部初始化为0,第二步是查询修改后的结果。但是第二步修改查询修改后的结果时,却发现有一条数据账户余额是100.导致的原因是,另一个事务插入了一条账户余额为100的数据,并提交了事务。因此将导致幻读现象。

四、事务的隔离级别

mysql中提供了四种事务的隔离级别,隔离级别越高,可以处理以上的问题越多,但性能越差

1、读未提交read uncommitted

可能导致的问题是脏读、不可重复读、幻读

2、读已提交read committed

可能导致的问题是不可重复读、幻读,可以解决脏读现象。

3、可重复读repeatable read(MySQL的默认隔离级别)

可能导致的问题是幻读,可以解决不可重复度、脏读现象。

4、串行化serializable

可以解决脏读、不可重复读、幻读,性能最差

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章