首页 > 数据库 >mysql事务隔离

mysql事务隔离

时间:2023-02-16 09:33:39浏览次数:38  
标签:事务 隔离 read 回滚 提交 mysql 级别

前言

简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的。你现在知道,MySQL是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如MySQL原生的MyISAM引擎就不支持事务,这也是MyISAM被InnoDB取代的重要原因之一;

隔离性与隔离级别

提到事务,你肯定会想到ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),今天我们就来说说其中之一“隔离性”。

当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。

隔离得越严实,效率就会越低。因此很多时候,我们都要在二者之间寻找一个平衡点。

SQL标准的事务隔离级别包括:

  • 读未提交(read uncommitted):一个事务还没提交时,它做的变更就能被别的事务看到;
  • 读提交(read committed):一个事务提交之后,它做的变更才会被其他事务看到;
  • 可重复读(repeatable read):行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的;
  • 串行化(serializable ):“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

例如:假设数据表T中只有一列,其中一行的值为1,下面是按照时间顺序执行两个事务的行为。

  • 若隔离级别是“读未提交”, 则V1的值就是2。这时候事务B虽然还没有提交,但是结果已经被A看到了。因此,V2、V3也都是2。
  • 若隔离级别是“读提交”,则V1是1,V2的值是2。事务B的更新在提交后才能被A看到。所以, V3的值也是2。
  • 若隔离级别是“可重复读”,则V1、V2是1,V3是2。之所以V2还是1,遵循的就是这个要求:事务在执行期间看到的数据前后必须是一致的。
  • 若隔离级别是“串行化”,则在事务B执行“将1改成2”的时候,会被锁住。直到事务A提交后,事务B才可以继续执行。所以从A的角度看, V1、V2值是1,V3的值是2。

我们可以看到在不同的隔离级别下,数据库行为是有所不同的。Oracle数据库的默认隔离级别其实就是“读提交”,因此对于一些从Oracle迁移到MySQL的应用,为保证数据库隔离级别的一致,你一定要记得将MySQL的隔离级别设置为“读提交”。

配置的方式是,将启动参数transaction-isolation的值设置成READ-COMMITTED。你可以用show variables来查看当前的值。

问题整理:

1、事务的特性:原子性、一致性、隔离性、持久性
2、多事务同时执行的时候,可能会出现的问题:脏读、不可重复读、幻读
3、事务隔离级别:读未提交、读提交、可重复读、串行化
4、不同事务隔离级别的区别:
读未提交:一个事务还未提交,它所做的变更就可以被别的事务看到
读提交:一个事务提交之后,它所做的变更才可以被别的事务看到
可重复读:一个事务执行过程中看到的数据是一致的。未提交的更改对其他事务是不可见的
串行化:对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完成才能继续执行
5、配置方法:启动参数transaction-isolation
6、事务隔离的实现:每条记录在更新的时候都会同时记录一条回滚操作。同一条记录在系统中可以存在多个版本,这就是数据库的多版本并发控制(MVCC)。
7、回滚日志什么时候删除?系统会判断当没有事务需要用到这些回滚日志的时候,回滚日志会被删除。
8、什么时候不需要了?当系统里么有比这个回滚日志更早的read-view的时候。
9、为什么尽量不要使用长事务。长事务意味着系统里面会存在很老的事务视图,在这个事务提交之前,回滚记录都要保留,这会导致大量占用存储空间。除此之外,长事务还占用锁资源,可能会拖垮库。
10、事务启动方式:一、显式启动事务语句,begin或者start transaction,提交commit,回滚rollback;二、set autocommit=0,该命令会把这个线程的自动提交关掉。这样只要执行一个select语句,事务就启动,并不会自动提交,直到主动执行commit或rollback或断开连接。
11、建议使用方法一,如果考虑多一次交互问题,可以使用commit work and chain语法。在autocommit=1的情况下用begin显式启动事务,如果执行commit则提交事务。如果执行commit work and chain则提交事务并自动启动下一个事务。

标签:事务,隔离,read,回滚,提交,mysql,级别
From: https://www.cnblogs.com/wanggfIT/p/17125479.html

相关文章

  • mysql事务隔离级别及实现原理,深度理解
    1、事务是什么?事务是数据库一个不可分的工作单元,可以将多个操作步骤表示为一个步骤。2、事务的四大特性Atomicity原子性,Consistency一致性,Isolation隔离性,Durability持......
  • TCC---分布事务4 笔记20230215
            ......
  • 解决mysqlclient安装报缺少Microsoft Visual C++ 14.0 is required
    安装mysqlclient报错error:MicrosoftVisualC++14.0isrequired.Getitwith“MicrosoftVisualC++BuildTools”1.不要去下载VisualStudio!!!==没什么用(对我而言)......
  • 2.mysql存储过程、存储函数与触发器
    --创建一个存储过程DELIMITER$CREATEPROCEDURE存储过程名称(返回类型参数名1参数类型1,....)[......]BEGIN--具体组成存储过程的SQL语句....END$DE......
  • 1.mysql创建索引
    --创建一个普通索引(方式①)createindex索引名ON表名(列名(索引键长度)[ASC|DESC]);--创建一个普通索引(方式②)altertable表名addindex索引名(列名(索引键长度)......
  • mysql keepalive +双主架构注意问题
    具体搭建参考Linux两节点+keepalive搭建MySQL双主集群-So怪咖-博客园(cnblogs.com)auto_increment_offset=1#双主复制中,2台服务器的自增长字段初值分别配置为1......
  • mysql 实现insert update 功能
    <insertid="insertOrUpdateSelective"keyColumn="id"keyProperty="id"parameterType="com.xxx.xxx.UserDO"useGeneratedKeys="true">INSERTINTOuser<tr......
  • 使用mysql管理软件导入恢复/导出备份mysql
    利用mysql管理工具导入导出,可以避免数据导入导出时出现的乱码问题,mysql的管理软件有很多,文本主要介绍NavicatPremium的使用方法,软件可以去官方搜索下载。本文来源于互联网......
  • mysql的性能的一些测试
    测试平台mysql8.0.31,2核心4线内存2G的虚拟机硬盘ssd,下面测试结果的瓶颈很多都来自这2G的内存。char比verchar块?首先说结论,差不多,没区别,别信谣110W数据,无......
  • 免安装MYSQL下载并安装
    一、去MYSQL官网下载https://www.mysql.com/官网首页翻到下面,点击如图所示的MySQLCommunityServer  二、解压,配置,安装可以看这篇教程:http://c.biancheng.net/vi......