iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mysql之事务提交和隔离级别
  • 385
分享到

Mysql之事务提交和隔离级别

2024-04-02 19:04:59 385人浏览 八月长安
摘要

Mysql之事务提交和隔离级别一、事务是什么?事务简言之就是一组sql执行要么全部成功,要么全部失败。mysql的事务在存储引擎层实现。1、事务都有ACID特性:原子性(Atomicity):一个事务必须被

Mysql事务提交和隔离级别

一、事务是什么?

事务简言之就是一组sql执行要么全部成功,要么全部失败。mysql的事务在存储引擎层实现。

1、事务都有ACID特性:

  • 原子性(Atomicity):一个事务必须被视为一个不可分割的单元;

  • 一致性(Consistency):数据库总是从一种状态切换到另一种状态;

  • 隔离性(Isolation):通常来说,事务在提交前对于其他事务不可见;

  • 持久性(Durablity):一旦事务提交,所做修改永久保存数据库

事务最常用的例子就是银行转账。假设polo需给tom转账1000元,如下步骤:

  • 确认polo账户余额高于1000元;

  • 从polo的账户余额减去1000元;

  • 将tom的账户余额增加1000元;

mysql> create table bank_accout(uid int not null,name varchar(255),balance decimal(9,2));
mysql> insert into bank_accout values(10001,'polo',5000),(10002,'tom',3000);
mysql> select * from bank_accout;
+-------+------+---------+
| uid | name| balance|
+-------+------+---------+
| 10001| polo| 5000.00|
| 10002| tom | 3000.00|
+-------+------+---------+


SQL语句如下:

mysql> BEGIN; 
mysql> select * from bank_accout;
+-------+------+---------+
| uid | name| balance|
+-------+------+---------+
| 10001| polo| 5000.00|
| 10002| tom | 3000.00|
+-------+------+---------+
mysql> UPDATE bank_account SET balance=balance-1000 WHERE uid=10001; 
mysql> UPDATE bank_account SET balance=balance+1000 WHERE uid=10002; 
mysql> COMMIT;

mysql> select * from bank_accout;
+-------+------+---------+
| uid | name| balance|
+-------+------+---------+
| 10001| polo| 4000.00|
| 10002| tom | 4000.00|
+-------+------+---------+

mysql> BEGIN;     
或者
mysql> START TRANSACTION;# mysql启动事务

mysql> Rollback;  # 回滚,返回修改之前。
mysql> commit;  # 提交数据,才真实修改数据。



上述步骤执行在一个事务中就能够保证数据的完整性,要么全部成功,要么全部失败。


2、Mysql提供两种事务型引擎:

Innodb和NDBCluster。默认采用自动提交模式,执行一条语句自动COMMIT。通过AUTOCOMMIT变量可启用或者禁用自动提交模式:

mysql> SHOW VARIABLES LIKE "AUTOCOMMIT"; 
+---------------+-------+ 
| Variable_name|Value |
+---------------+-------+
| autocommit  | ON  | 
+---------------+-------+ 
1 row in set (0.00 sec)

mysql> SET AUTOCOMMIT=1;

AUTOCOMMIT=1表示开启默认提交,0表示关闭默认提交需要手动提交。


二、事务隔离级别

事务隔离性的解释:通常情况下,事务在提交之前对于其他事务不可见。

数据库有四种隔离级别,当然Mysql也是如此。分别为:

  • READ UNCOMMITED(未提交读)

  • READ COMMITED(已提交读)

  • EPEATABLE READ(可重复读)

  • SEaiALIZABLE(可串行化)

个人理解 : 隔离级别就是决定一个事务的修改,另一个事务什么情况下可见。

书本解释 : 隔离级别都规定了一个事务中所做修改,哪些在事务内和事务间是可见的。

上面两段理解的区别在于是否存在事务内可见性的规定。

开始说明Mysql的四种隔离级别,先准备一张学生表:

mysql> CREATE TABLE `student` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(32) NOT NULL DEFAULT '',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

只有id(主键自增)与name字段


1、READ UNCOMMITTED(未提交读)

事务中修改没有提交对其他事务也是可见的,俗称脏读。非常不建议使用。

例:

客户端A和B设置隔离级别为未提交读

mysql> SET SESSION TX_ISOLATION='READ-UNCOMMITTED';

客户端A与B开启事务并查询student

mysql> BEGIN; 
mysql> SELECT * FROM student; 
Empty set (0.00 sec)

客户端A和B都是空数据

客服端B插入一条新的数据

mysql> INSERT INTO student(name) VALUES("polo"); 
Query OK, 1 row affected (0.00 sec)


此时事务未提交,客服端A查看student表

mysql> SELECT * FROM student; 
+----+------+ 
| id| name| 
+----+------+ 
| 1 | polo|
+----+------+


客户端A看到B未提交的修改

客户端B执行回滚操作

mysql> ROLLBACK;


成功之后,客户端A查看student表

mysql> SELECT * FROM student; 
Empty set (0.00 sec)

客户端A查看数据为空

以上可以看出未提交读隔离级别的危险性,对于一个没有提交事务所做修改对另一个事务是可见状态,容易造成脏读。非特殊情况不得使用此级别


2、READ COMMITTED(提交读)

多数数据库系统默认为此级别(Mysql不是)。已提交读级别即为一个事务只能已提交事务所做的修改,也就解决了未提交读的问题,即脏读的问题。

例:

客户端A和B设置隔离级别为已提交读

mysql> SET SESSION TX_ISOLATION='READ-COMMITTED';


客户端A与B开启事务并查询student

mysql> BEGIN; 
mysql> SELECT * FROM student; 
Empty set (0.00 sec)


客户端A和B都为空

客服端B插入一条新的数据,不提交

mysql> INSERT INTO student (name) VALUES('polo');


客户端A查看student

mysql> SELECT * FROM student; 
Empty set (0.00 sec)


注意这里与上面不同了,在客户端B没有提交事务情况下无数据

下面客户端B提交事务

mysql> COMMIT;


客户端A再次查看student表。

mysql> select * from student;
+----+------+
| id|name |
+----+------+
| 2 |polo |
+----+------+

成功读取到客户

从上面的示例可以看出,提交读没有了未提交读的问题,但我们可以看到在客户端A的一个事务中执行两次同样的SELECT语句得到不同结果,因此已提交读又被称为不可重复读。同样筛选条件可能得到不同的结果。


3、REPEATABLE READ(可重复读)

解决已提交读不可重复读取的问题。

例:

客户端A和B设置隔离级别为可重复读

mysql> SET SESSION tx_isolation='REPEATABLE-READ';


客户端A与B开启事务并查看

mysql> BEGIN; 
mysql> select * from student;
+----+------+
| id | name |
+----+------+
| 2 | polo |
+----+------+

客服端B更新polo为tom,并提交事务

mysql> UPDATE student SET name='tom' WHERE id=2; 
mysql> COMMIT;


客户端A查看student表

mysql> select * from student;
+----+------+
| id| name|
+----+------+
| 2 | polo|
+----+------+

注意客户端A查看数据未变,没有不可重复读问题

客户端A提交事务,并查看student表

mysql> COMMIT; 
mysql> select * from student;
+----+------+
| id| name|
+----+------+
| 2 | tom |
+----+------+

上面实例可知,可重复读两次读取内容一样。数据库这级别并没有解决幻读的问题。但是MYSQL在可重复读基础上增加了mvcC机制解决了此问题,实例无法演示幻读效果。

什么是幻读?

首先,可重复读定范围为当前查询到的内容,如执行

mysql> SELECT * FROM student WHERE id>=1


锁定的即id>=1查到的行,为行级锁。如另一事务执行并默认提交以下语句

mysql> INSERT INTO student (name) VALUES ('polo');

新增的这行并没有被锁定,此时读取student

mysql> SELECT * FROM student WHERE id>=1;
+----+-------+
| id| name |
+----+-------+
| 2 | tom |
| 3 | polo |
+----+-------+

便出现了幻读

除了使用MYSQL的MVCC机制,还可以使用可串行化隔离级别解决此问题。

4、SEAIALIZABLE(可串行化)

可串行化是最高隔离级别,强制事务串行执行。执行串行了也就解决了一切的问题,这个级别只有在对数据一致性要求非常严格且没用并发的情况下使用

例:

客户端A和B设置隔离级别为可串行化

mysql> SET SESSION tx_isolation='SERIALIZABLE';


客户端A执行查询

mysql> BEGIN;
mysql> SELECT * FROM student WHERE id<4; 
+----+---------+ 
| id | name   | 
+----+---------+ 
|  1| polo   | 
|  2| tom     | 
+----+---------+ 
2 rows in set (0.00 sec)


客户端B执行新增

mysql> INSERT INTO student (name) VALUES('yy');


此时我们会发现INSERT语句被阻塞执行,原因就是A执行了查询表student同时满足id<4,已被锁定。如果查询表student条件为id<3,则新增语句可正常执行。

Mysql之事务提交和隔离级别


您可能感兴趣的文档:

--结束END--

本文标题: Mysql之事务提交和隔离级别

本文链接: https://www.lsjlt.com/news/52705.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mysql之事务提交和隔离级别
    Mysql之事务提交和隔离级别一、事务是什么事务简言之就是一组SQL执行要么全部成功,要么全部失败。MYSQL的事务在存储引擎层实现。1、事务都有ACID特性:原子性(Atomicity):一个事务必须被视...
    99+
    2024-04-02
  • Mysql事务隔离级别之读提交的示例分析
    这篇文章主要为大家展示了“Mysql事务隔离级别之读提交的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Mysql事务隔离级别之读提交的示例分析”这篇文...
    99+
    2024-04-02
  • oracle之事务隔离级别
    本文小节了oracle中事务隔离级别。 ANSI SQL标准定义了4中隔离级别: READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZAB...
    99+
    2024-04-02
  • 【MySQL】事务及其隔离性/隔离级别
    需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云-->阿里云-->华为云 show variables like 'autocommit';+---------------+-------+| Variable_name...
    99+
    2023-09-01
    mysql 数据库
  • mysql事务隔离的级别
    这篇文章主要介绍“mysql事务隔离的级别”,在日常操作中,相信很多人在mysql事务隔离的级别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql事务隔离的级别”的疑惑...
    99+
    2024-04-02
  • mysql 5.5 innodb事务隔离级别之开篇
    小结:     1,事务隔离级别隶属于rdbms的acid之i,即隔离性     2,不同的事务隔离级别,导致一致性读的行为有所差异     ...
    99+
    2024-04-02
  • mysql事务隔离级别详情
    serializable 串行化(无问题) 事务必须以顺序的方式执行,前一个事务提交之前后面的事务无法进行提交,最安全,但是不能并发操作,导致效率低下. repeatab re...
    99+
    2024-04-02
  • MySQL事务隔离级别详解
    一、什么是事务? 事务是逻辑上的一组操作,要么全执行,要么全不执行。 事务最经典栗子也经常被拿出来的栗子就是银行转账了。比如小明要给小红转账1000元,这个转账会涉及到两个关键操作:将小明的余额减1000元,将小红的余额减1000元。万一这...
    99+
    2023-08-30
    mysql
  • MySQL的事务隔离级别介绍
    本篇内容介绍了“MySQL的事务隔离级别介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是事务?数据...
    99+
    2024-04-02
  • MySQL有哪些事务隔离级别
    MySQL有哪些事务隔离级别,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。数据库事务有四种隔离级别:未提交读(Read Unc...
    99+
    2024-04-02
  • MYSQL事务的隔离级别与MVCC
    目录前言1. 事务(transaction)的起源1.1. 事务的定义1.2. 哪些存储引擎支持事务2. MySQL的事务语法2.1. 自动提交2.2. 手动操作事务2.2.1. 开...
    99+
    2024-04-02
  • 一文带你了解MySQL之事务隔离级别和MVCC
    目录 一、数据准备二、事务隔离级别2.1 事务并发执行遇到的问题2.2 SQL标准中的四种隔离级别2.3 MySQL中支持的四种隔离级别 三、MVCC3.1 版本链3.2 ReadView3.2.1 READ COMMITTED...
    99+
    2023-08-16
    mysql 数据库 数据库开发 大数据 数据库架构
  • MySQL事务隔离级别有哪些
    这篇文章给大家介绍MySQL事务隔离级别有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。说说事务的隔离级别吧老实说,事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前...
    99+
    2024-04-02
  • MySQL事务和MVCC怎么实现隔离级别
    这篇文章主要讲解了“MySQL事务和MVCC怎么实现隔离级别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL事务和MVCC怎么实现隔离级别”吧!数据...
    99+
    2024-04-02
  • MySql学习笔记之事务隔离级别详解
    背景 说的事务,大家应该都不陌生,开发用到 MySql 数据库的时候,通常会用到事务。其中比较经典的例子就是转账,比如你要给小明转 50 块钱,而此时你的银行卡也就只有 50 块钱...
    99+
    2024-04-02
  • mysql如何查看事务隔离级别
    要查看MySQL数据库的当前事务隔离级别,可以执行以下命令: SELECT @@tx_isolation; 该命令将返回当前数据库...
    99+
    2024-04-17
    mysql
  • MySQL中事务有哪些隔离级别
    MySQL中事务有哪些隔离级别,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。什么是事务事务,由一个有限的数据库操作序列构成,这...
    99+
    2024-04-02
  • MySQL中有几种事务隔离级别
    这篇文章主要介绍MySQL中有几种事务隔离级别,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 在数据库操作中,为了有效保证并发读取数据的正确性,提出的事...
    99+
    2024-04-02
  • mysql如何修改事务隔离级别
    小编给大家分享一下mysql如何修改事务隔离级别,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!用户可以用SET TRANSACT...
    99+
    2024-04-02
  • mysql的事务隔离级别是什么
    这篇“mysql的事务隔离级别是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysq...
    99+
    2023-01-31
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作