Mysql事务及隔离级别

  • 1.事务是什么?
  • 2.事务操作
  • 演示
  • 3.事务的特性
  • 4.事务隔离级别及代码演示
  • 0)查看和设置事务隔离级别
  • 1)读未提交(read uncommitted)
  • 2)读已提交(read committed)
  • 3)可重复读(repeatable read)
  • 4)序列化(serializable)


1.事务是什么?

事务是一系列sql操作的组合,这些操作作为一个整体来运行,要么全部成功,要么全部失败
mysql默认的InnoDB存储引擎支持事务操作,其它存储引擎都不支持事务操作

2.事务操作

# 开启事务
start transaction;

#提交事务
commit;

# 回退
rollback;

演示

建表:

create table if not exists Person(name varchar(20));

操作1:

mysql事务隔离级别原理 mysql 事务隔离级别的使用_数据


操作2:

mysql事务隔离级别原理 mysql 事务隔离级别的使用_mysql事务隔离级别原理_02

3.事务的特性

  1. 原子性
    事务是一系列操作的整体,是最小的工作单元,不可再分
  2. 一致性
    事务中的所有操作要么全部成功,要么全部失败
  3. 隔离性
    并发执行的多个事务相互独立,并不干扰
  4. 永久性
    事务提交之后,数据库就会保存没有提交的数据,提交之后对数据库的改变是不可回退的

4.事务隔离级别及代码演示

事务隔离级别有四种:
读未提交、读已提交、可重复读、序列化

0)查看和设置事务隔离级别

查看事务隔离级别:

select @@tx_isolation;

设置事务隔离级别:

# 设置数据库事务隔离级别为读未提交
set global transaction isolation level read uncommited;
# 设置数据库事务隔离级别为读已提交
set global transaction isolation level read commited;
# 设置数据库事务隔离级别为可重复读
set global transaction isolation level repeatable read;
# 设置数据库事务隔离级别为序列化
set global transaction isolation level serializable;

设置事务隔离级别后需要退出mysql客户端并重新打开,这时隔离级别才会修改过来

1)读未提交(read uncommitted)

两个并发的事务,一个事务可以读取到另外一个事务提交之前的数据(也就是没有提交的数据)
存在的问题是脏读,也就是读取到的数据并不一定是最后存储到数据库的数据,读取到的可能是临时数据

演示:

mysql事务隔离级别原理 mysql 事务隔离级别的使用_mysql事务隔离级别原理_03

2)读已提交(read committed)

两个并发的事务,一个事务只能读取到另一个事务提交之后的数据
这种隔离级别存在不可重复读的问题,也就是一个事务中多次读取到的数据是不一致的,因为当事务1读取事务2提交之前和提交之后的数据可能是不同的

演示:

mysql事务隔离级别原理 mysql 事务隔离级别的使用_隔离级别_04

3)可重复读(repeatable read)

一个事务只能读取到本次事务开始之前的数据,即使在另一个事务中修改数据并提交了事务或者提交了多个事务,读取到的数据还是本次事务开始之前的数据,也就是说多次数据读取到的数据是重复的。但是这种隔离级别存在幻读问题,也就是说读取到的数据并不真实,数据库中的数据可能在此次事务运行期间发生了修改。

演示:

mysql事务隔离级别原理 mysql 事务隔离级别的使用_事务隔离级别_05

4)序列化(serializable)

一个事务开启后,其它事务就不能运行,直到先开启的事务运行结束;

演示:

mysql事务隔离级别原理 mysql 事务隔离级别的使用_隔离级别_06