mysql事务隔离级别

一、基本介绍

what?

==多个链接==开启各自事务操作数据库,数据库系统要负责 ==隔离操作==,以保证各个链接在获取数据时的准确性。

隔离级别:定义了事务与事务之间的隔离程度。

不考虑隔离性,可能会引发一下问题:

  • 脏读
    一个事务读取到了另一个事务,==尚未提交的修改==。
  • 不可重复读
    不可重复读对应的操作为 ==修改/删除==
  • 幻读
    幻读对应的操作为 ==插入==

二、具体分析

image-20221113143117565

查看隔离级别

1
2
3
4
5
6
7
8
9
旧版 select @@tx_isolation;
新版 (5.7以后及8) select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ |
+-------------------------+
1 row in set (0.00 sec)

隔离级别的设置操作必须在==开启事务之前==,否则会不生效!!!。

1.读未提交 ——–set session transactionread committed

1
2
设置命令
set session transaction isolation level read uncommitted

有A、B两个链接,B的链接为 ==Read uncommitted==.

ALTER TABLE account ADD name VARCHAR(255);

A 连接的事务还在修改,但未提交,

B 处的链接就可以查看到 A 事务所做的修改—-

看到未提交的修改–脏读、不可重复读

看到插入的新数据—幻读

2.读已经提交

1
set session transaction isolation level read committed

A 、B:为 read commited

A、B均为commit

A未提交时,B不可以读到A修改的数据。

A提交后,B可以读到。

3.可重复读——-> mysql 默认级别

1
set session transaction isolation level repeatable read;

4.序列化

synchronized,线程同步(事务同步)

每一次读取到的数据都是最真实的,并且==效率最低的==.

当有另一个事务在进行的时候

三、怎么启动事务

三、操作

  1. 查看系统隔离级别

    1
    select @@global.transaction_isolation;
  2. 查看会话的级别

    1
    select @@transaction_isolation;
  3. 修改系统隔离

    1
    set global transaction isolation level 级别;
  4. 设置会话隔离级别

    1
    set ==session== transaction isolation level 级别;