欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql事务-事务隔离isolation

程序员文章站 2022-07-02 21:50:33
...

事务(ACID)

概念

  1. 事务 是要保证一组数据库操作,要么全部执行成功,要么都不执行。
  2. mysql支持多引擎,但是并不是所有引擎都支持事务,
    mysql中只有使用了Innodb数据库引擎才支持事务
  3. 事务的特性(ACID) :Atomicity原子性,consistency一致性,isolation隔离性,durability持久性。

本文主要了解隔离性。

事务隔离的级别

当数据库上有多个事务同时执行的时候,就可能出现脏读,不可重复读,幻读的问题,为了解决这些问题,就有了事务隔离。

事务隔离的越严谨性能越差,所以实际运用中要在性能和数据之间寻找一个平衡点。
事务隔离的级别:

  • 读未提交:一个事务还未提交的情况下,事务中的变更可以被其他事务看到。
  • 读提交:一个事务提交后,事务中的变更才会被其他事务看到。
  • 可重复读:事务执行过程中读到的数据始终和事务启动时的数据一致。
  • 串行化:对于同一行数据,读数据会加读锁,写数据会加写锁,当出现读写锁冲突时,后启动的事务要等待先启动的事务执行后才可以继续执行。

本文重点介绍读提交和可重复读。

视图

在mysql中有两个视图的概念:

  • view:它是用一个查询语句定义的虚拟表。创建语句:create view as select…执行查询语句并生成view。查询方式和表一样。
  • consistent read view:Innodb实现mvcc(多版本并发控制)时用到的一致性视图。用于支持RC(读提交)和RR(可重复读)隔离级别的实现。

到此所有相关概念已经介绍完毕,接下来进行数据库操作。

数据库准备

CREATE TABLE `t` (
  `k` int(11) DEFAULT NULL
) ENGINE=InnoDB;
insert into t(k) values(1);

隔离级别实验

查询当前窗口隔离级别:
SELECT @@session.tx_isolation;

设置当前连接窗口隔离级别:
SET SESSION TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE};

mysql事务-事务隔离isolation
接下来看一下在不同的隔离事务级别下,事务A中a2、a3、a4会有什么不同的结果。

  • 读提交:事务B提交后事务A可见。即a2是1,a3是2,a4是2.读提交每个语句执行之前会重新计算最新的视图。承认语句执行前的已提交的变更。
  • 读未提交:事务未提交,变更对其他事务可见。虽然事务B未提交但是对事务A可见。即a2、a3、a4都是2.
  • 可重复读:事务过程中始终保证看到的数据和事务启动时一致。事务A未提交之前的数据始终保持和a1一致。即a1、a2、a3都是1。事务A查询a4的select语句默认自动提交,此语句的事务开始在事务B之后,对事务B的变更可见,即a4是2.
  • 串行化:则在事务 B 执行update的时候,会被锁住。直到事务 A 提交后,事务 B 才可以继续执行。即a2、a3是1,a4是2。

总结

以上现象具体实现:不同隔离级别下,会根据规则创建一个数据快照,即一致性视图。
在读提交隔离级别下,在sql语句执行前计算并创建最新视图,此视图承认所有已提交的变更数据。
在可重复读隔离级别下,会在事务真正启动时,创建一致性视图,此视图包含所有已提交变更版本的数据及正在执行的事务,整个事务过程中始终都用这一个视图,在不存在update(当前读)语句情况下,数据值不会发生改变。
读未提交隔离级别下,直接返回记录上的最新值,不存在视图。
串行化利用读写锁保证数据一致性,不存在并行访问。