Mysql事务隔离机制

ACID原则:

了解Mysql事务隔离机制首先需要理解什么是ACID:

  1. A : 原子性automicity,一个事务作为不可分割的最小单元,一个事务里面的所有操作要么全部成功,要么全部失败。
  2. C:一致性consistency,事物结束后系统状态是一致的,即 数据不能平白无故的产生,也不能平白无故的消失,例如一个转账业务事务,最终所有账户余额不变。
  3. I:隔离性isolation,简单的讲,一个事务所有的操作,在最后Commit 之前,所有修改对其他事务不可见
  4. D:持久性durability,当事务提交后,数据应该永久被保存到数据中,即使发生了灾难性后果,数据也不会丢失

Mysql数据库隔离级别:

在实际的运用情况下实现ACID是非常困难的,而且性能上也会大打折扣,很多时候不同的业务对事务的要求不一样,所以为了提升性能并满足业务,数据库提供了4种不同的隔离级别来供用户选择

  1. 未提交读(Read UNCOMMITTED): 这种级别,当一个事务对数据进行修改后,即使没有提交,也会被其他事务读取到,高并发状态下极易产生脏读。
  2. 已提交读(READ COMMITTED):在一个事务的整个操作过程中,所有的数据修改对其他事务不可见,但这种情况下会导致其他事务中产生不可重复读(即两次读取结果不一致),这个级别也叫作不可重复读
  3. 可重复读(REPEATABLE READ):Mysql的默认事务隔离级别,该级别可以保证一个事务在整个流程中,多次读取同样记录的结果相同,但是没有解决幻读的问题。
  4. 可串行化(SERIALIZABLE): 是事务最高隔离级别,对同一张表的所有的读写都会阻塞,每次都需要获取表级共享锁

多个事务下数据产生的问题有哪些:

  1. 脏读: 事务A读取到另一个事务B未提交的修改,事务B回滚修改,那么事务A就读取了脏读。
  2. 不可重复读: 事务A读取记录C,在这个过程中事务B将记录C修改中字段进行修改,那么当事务A再次读取记录C时,获取到的结果与第一次不同,叫做不可重复读。
  3. 幻读:幻读于不可重复读类似,当事务A第一次读取某个范围记录后,事务B新增了一条记录,事务A在此读取这个范围是会多一条记录导致幻读出现

不同事务隔离级别分别解决什么问题

隔离级别 脏读 不可重复读 幻读
未提交读(Read UNCOMMITTED) 存在 存在 存在
已提交读(READ COMMITTED) 不存在 存在 存在
可重复读(REPEATABLE READ) 不存在 不存在 存在
可串行化(SERIALIZABLE) 不存在 不存在 不存在

Mysql事务常用命令:

有兴趣的同学可以打开几个Sql命令界面,试一下上面的场景,以下是一些常用的事务处理sql:

SELECT @@tx_isolation;  -- 查询当前隔离机制

begin; -- 开始事务

rollback; -- 回滚

commit; -- 提交

-- 设置当前会话隔离级别
set session transaction isolation level read uncommitted; -- 未提交读
set session transaction isolation level read committed; -- 已提交读
set session transaction isolation level repeatable read; -- 可重复读
set session transaction isolation level serializable; -- 可串行化

-- 设置系统隔离级别
set global transaction isolation level read uncommitted; -- 未提交读
set global transaction isolation level read committed; -- 已提交读
set global transaction isolation level repeatable read; -- 可重复读
set global transaction isolation level serializable; -- 可串行化

以上仅为博主的粗浅认识,大家有更好的建议请留言,博主会及时更正!!!

猜你喜欢

转载自blog.csdn.net/zhangyong01245/article/details/93888868