【MySQL学习笔记】事务和MySQL中事务隔离级别修改

一、事务的概念

事务:一组操作逻辑,使数据从一个状态转变到另一个状态。
事务特性

  • 原子性(atomicity):
    一个不可分割的工作单元,要么全部提交,要么全部回滚。
  • 一致性(consistency):
    事务执行前后,数据从一个合法状态转变到另一个合法状态
  • 隔离性(isolation):
    事务之间相互不干扰。
  • 持久性(durablility)
    事务被提交,则对数据修改时永久性的。

事务状态:

  • 活动(active):事务正在执行中
  • 部分提交(partially committed):数据已提交到内存,未修改到磁盘
  • 失败(failed):活动和部分提交的中的事务,出现异常,导致无法继续执行。
  • 中止(aborted):失败的事务回滚执行完成后。
  • 提交(committed)

二、基本操作

1、显示事务

开启事务:start transaction或者begin
保存点:savepoint [name];
回滚:rollback
提交:commit

2、隐式事务

MySQL变量autocommit默认设置为ON,设置为false即可关闭自动DML事务提交。

##查询变量
show variables like "autocommit";
## 关闭自动提交
set autocommit=false;
## 开启自动提交
set autocommit=ture;
  • DDL自动提交。
  • 针对用户的操作会自动提交。
  • 两个事务间无commitrollback则前一个事务会自动提交。
  • start slavestop slavereset slavechange master to这些关于MySQL主从复制的语句会隐式提交。
  • analiyze tablecache indexcheck tableflushload index into cacheoptimize tablerepair tablereset等也会隐式提交。

三、事务隔离级别

1、问题背景

在事务并发时,常出现一些问题:

  • **脏写:**事务A、B同时开启,在未终止或未提交前,事务A修改了事务B中修改的数据。
  • **脏读:**事务A、B同时开启,事务A读取了事务B更新而未提交的数据,事务B最终回滚了数据,则A读取的数据是脏数据。
  • **不可重复读:**事务A、B同时开启,在事务A两次读取同一字段之间,事务B修改了该字段,导致事务A两次读取字段结果不同。
  • **幻读:**事务A、B同时开启,在事务A两次读取同一字段之间,事务B插入一些行,导致事务A两次读取字段结果增加。

一般认为问题严重程度排序如下:
脏写 > 脏读 > 不可重复读 > 幻读

2、SQL事务隔离级别

  • READ UNCOMMITTED 读未提交。
  • READ COMMITTED 读已提交。
  • REPEATABLE READ 可重复读。
  • SERIALIZABLE 可串行。
隔离级别 脏读 不可重复读 幻读 加锁读
READ UNCOMMITTED Yes Yes Yes No
READ COMMIITTED No Yes Yes No
REPEATABLE READ No No Yes No
SERIALIZABLE No No No Yes

3、查看和修改MySQL中的事务隔离级别

MySQL默认事务隔离为REPEATABLE-READ.

## 查看事务隔离级别
show @@transection;

## 设置事务隔离级别
set [global|session] transection_istoloation='READ-UNCOMMITTED | READ-COMMIITTED | REPEATABLE-READ | SERIALIZABLE';

## 在my.cnf写入,写在[mysqld]下
transaction-isolation = READ-COMMITTED

你可能感兴趣的:(MySQL,mysql,数据库,sql)