使用事务语法

1. 开启事务start transaction,可以简写为 begin

2. 然后记录之后需要执行的一组sql

3. 提交commit

4. 如果所有的sql都执行成功,则提交,将sql的执行结果持久化到数据表内。

5. 回滚rollback

6. 如果存在失败的sql,则需要回滚,将sql的执行结果,退回到事务开始之时

7. 无论回滚还是提交,都会关闭事务!需要再次开启,才能使用。

8. 还有一点需要注意,就是事务只针对当前连接。

下面我们来进行演示:

使用第一个链接A,开启事务后,执行一条update语句。

结果成功,数据已经变成修改之后!

此时我们没有提交。

再从其他连接B来查看,发现数据末更改:

此时如果连接A选择提交,也就是commit操作。则连接B的数据也会发生变化。

而如果连接A选择回滚,也就是rollback操作。则连接A再次查询则发现数据还原。


基本原理

语法说完了,浮躁的人也不用继续看下去了。下面简单说一下事务的基本原理吧。
提交,就会将结果持久化,不提交就不会。

如果我们不开启事务,只执行一条sql,马上就会持久化数据,可以看出,普通的执行就是立即提交。

这是因为MySQL默认对sql语句的执行是自动提交的。

也就是说,开启事务,实际上就是关闭了自动提交的功能,改成了commit手动提交!

我们可以通过简单的对是否自动提交加以设置,完成开启事务的目的!

自动提交的特征是保存在服务的一个autocommit的变量内。可以进行修改:

set autocommit = 0;关闭

set autocommit = 1;开启

还需要注意一点,就是事务类似于外键约束,只被innodb引擎支持。


特点

下面来说说事务的特点ACID。也就是原子性,一致性,隔离性和持久性。

原子性:事务的一组操作是原子的不可再分割的,这组操作要么同时完成要么同时不完成。类似于一个CAS(compare and swap)(有时间会讲解cas)

一致性:事务在执行前后数据的完整性保持不变。(例:原本的外键约束在进行事务成功后不会损坏)

隔离:当多个事务同时操作一个数据库时,可能存在并发问题,此时应保证各个事务要进行隔离,事务之间不能互相干扰。

持久性:事务一旦被提交,就不可能再被回滚!


事务并发

事务并发会带来一些问题,所以才有了不同的事务隔离级别。要想了解事务的隔离级别,就必须首先了解事务并发会带来的问题。

一般来说,会出现三类数据读问题和数据更新问题。

脏读

一个事务正在对一条记录做修改,但未提交,另一个事务读取了这些脏数据,并进一步处理,就会产生未提交的数据依赖。

举一个例子:

时间

转账事务A 取款事务B
T1   开始事务
T2 开始事务  
T3   查询账户余额为1000元
T4   取出500元把余额改为500元
T5 查询账户余额为500元(脏读)  
T6   撤销事务余额恢复为1000元
T7 汇入100元把余额改为600元  
T8 提交事务  

A读取了B尚未提交的脏数,导致最后余额为600元。

不可重复读

一个事务在不同时间读取数据不一致。

举一个例子:

时间

取款事务A 转账事务B
T1   开始事务
T2 开始事务  
T3   查询账户余额为1000元
T4 查询账户余额为1000元  
T5   取出100元把余额改为900元
T6   提交事务
T7 查询账户余额为900元(和T4读取的不一致)  

可以看到最后读取的数据不一致。

幻读

幻读和不可重复读的概念类似,都是不同时间数据不一致,只不过幻读是针对新增数据,而不可重复读是针对更改数据。

看一个例子:

时间

统计金额事务A 转账事务B
T1   开始事务
T2 开始事务  
T3 查询用户id为8的数据,结果为空,执行插入(id为pk)  
T4   新增一个id为8的数据
T5   提交事务
T6 提交事务,插入报错  

隔离级别

事务并发带来的问题前文已经描述得非常仔细了。事务的隔离级别就是为了针对并发出现的问题,不同的级别可以保证不同的一致性。

为了解决上面讲到的并发事务处理带来的问题,SQL标准提出了4个等级的事务隔离级别。不同的隔离级别在同样的环境下会出现不同的结果。

隔离级别设置及查看

mysql> select @@tx_isolation;

+-----------------+

| @@tx_isolation  |

+-----------------+

| REPEATABLE-READ |

+-----------------+

1 row in set (0.00 sec)

mysql> set tx_isolation = 0; (备注:0 - 3 对应数据库四种隔离级别)

Query OK, 0 rows affected (0.00 sec)

下面看看四种隔离级别的比较:

Read Uncommitted(读取未提交内容)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

Read Committed(读取提交内容)

这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

Repeatable Read(可重读)

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

Serializable(可串行化)

  这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

隔离级别 读数据一致性 脏读 不可重复读 幻读
未提交读(Read uncommitted) 最低级别,只能保证不读取物理上损坏的数据
已提交读(Read committed) 语句级
可重复读(Repeatable read) 事务级
可序列化(Serializable) 最高级别,事务级

mysql事务_事务隔离级别详解的更多相关文章

  1. MySQL事务及隔离级别详解

    MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...

  2. MySQL事务隔离级别详解

    原文地址:http://xm-king.iteye.com/blog/770721 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级 ...

  3. MySQL事务,事务隔离级别详解

    1.什么是事务 指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 2.事务的4个特性 原子性(Atomicity).一致性(Consistency).隔离性(Isolatio ...

  4. MySQL事务隔离级别详解(转)

    原文: http://xm-king.iteye.com/blog/770721 SQL标准对事务定义了4种隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔 ...

  5. 1031MySQL事务隔离级别详解

    转自http://xm-king.iteye.com/blog/770721 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支 ...

  6. JDBC事务与事务隔离级别详解

    事务基本概念 一组要么同时执行成功,要么同时执行失败的SQL语句.是数据库操作的一个执行单元. 事务开始于: 连接到数据库上,并执行一条DML语句insert.update或delete 前一个事务结 ...

  7. SQL Server事务、隔离级别详解(二十九)

    前言 事务一直以来是我最薄弱的环节,也是我打算重新学习SQL Server的出发点,关于SQL Server中事务将分为几节来进行阐述,Always to review the basics. 事务简 ...

  8. MSSQL事务隔离级别详解(SET TRANSACTION ISOLATION LEVEL)

    控制到 Transact-SQL 的连接发出的 SQL Server 语句的锁定行为和行版本控制行为. TRANSACT-SQL 语法约定 语法   -- Syntax for SQL Server ...

  9. SQL Server-聚焦事务、隔离级别详解(二十九)

    前言 事务一直以来是我最薄弱的环节,也是我打算重新学习SQL Server的出发点,关于SQL Server中事务将分为几节来进行阐述,Always to review the basics. 事务简 ...

  10. MySQL 四种隔离级别详解,看完吊打面试官

    转发链接:https://zhuanlan.zhihu.com/p/76743929 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就 ...

随机推荐

  1. 「懒惰的美德」我用 python 写了个自动生成给文档生成索引的脚本

    我用 python 写了一个自动生成索引的脚本 简介:为了刷算法题,建了一个 GitHub仓库:PiperLiu / ACMOI_Journey,记录自己的刷题轨迹,并总结一下方法.心得.想到一个需求 ...

  2. 软工团队作业--Scrum冲刺集合贴

    软工团队作业--Scrum冲刺集合贴 团队 团队名称:广东靓仔六强选手 团队成员: 黄清山 黄梓浩 钟俊豪 周立 邓富荣 郑焕 博客链接 Scrum 冲刺 第一篇 Scrum 冲刺 第二篇 Scrum ...

  3. CF1400F - x-prime Substrings

    1400F - x-prime Substrings 首先发现 \(x\) 很小,所以发现对应的 x-prime 字符串数也很少,最多的情况是 \(x = 19\),有 2399 个,先爆搜出来. 现 ...

  4. CF1406E 【Deleting Numbers】

    蒟蒻语 蒟蒻这次 \(CF\) 又双叒叕掉分了,\(C\) 都没有调出来. 还好再最后 \(10\) 秒钟调了下 \(E\) 块长 (块长 \(100\) => \(98\)),才没有掉得那么惨 ...

  5. Codeforces Edu Round 56 A-D

    A. Dice Rolling 把\(x\)分解为\(a * 6 + b\),其中\(a\)是满6数,\(b\)满足\(1 <= b < 6\),即可... #include <io ...

  6. 【Django 字段和相关参数补充】

    字段类型: 1.models.AutoField 自增列=int(11) 如果没有的话,默认会生成一个名称为id的列,如果要显示的自定义一个自增列,必须将给列设置为主键primary _key=Tru ...

  7. Qingcloud_MySQL Plus(Xenon) 高可用搭建实验

    实验:Xenon on 5.7.30 Xenon (MySQL Plus) 是青云Qingcloud的一个开源项目,号称金融级别强一致性的高可用解决方案,项目地址为 https://github.co ...

  8. Goldengate搭建

    OGG进程 捕获进程(源端):捕获online redo log或者archived log中增量事务日志 传输进程(源端):把目标端落地的trail文件通过配置的路由信息传输到目标端 网络传输:tc ...

  9. RMAN迁移数据库(不改变文件目录)

    1.目标库创建相应目录mkdir -p /u01/app/oracle/oradata/orclmkdir -p /u01/app/oracle/fast_recovery_area/ORCLmkdi ...

  10. 工具-效率工具-listary快速打开文件,win+R使用(99.1.1)

    @ 目录 1.使用WIN+R打开软件 2.使用listary软件 1.使用WIN+R打开软件 添加环境变量 找到需要打开应用的目录 如我的桌面(C:\Users\Public\Desktop) 添加p ...