mysql事务隔离级别

MySQL事务隔离级别 本文主要探讨MySQL事务隔离级别的使用,具体什么场景使用啥,实战验证出现的并发事务问题 阅读详情

概念

什么是事务

一个程序执行单元,包含一系列操作,要么全部成功,要么全部失败,这就是事务

事务的特性

原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability):持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

事务隔离级别

为了解决并发数据操作保证不同事务的正确执行提出了四种隔离级别

未授权读取:也称为读未提交(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。

授权读取:也称为读提交(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。

可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻读数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。

序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

实例

可重复读

打开两个cmd,连接mysql数据库,修改隔离级别

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
1 row in set, 1 warning (0.00 sec)

mysql> set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)

mysql> set global transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ       |
+-----------------------+
1 row in set (0.00 sec)

mysql> select @@session.tx_isolation;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| REPEATABLE-READ        |
+------------------------+
1 row in set (0.00 sec)

插入

两个cmd同时开启事务,一个进行查询,另一个进行插入语句并且commit,第一个再一次查询,结果不变,插入操作支持可重复读

第一个cmd
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from custom;
Empty set (0.02 sec)

mysql> select * from custom;
Empty set (0.00 sec)

第二个cmd
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into custom(address) values('a');
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.01 sec)

修改

两个cmd同时开启事务,一个进行查询,另一个进行修改并且commit,第一个再一次查询,结果不变,修改操作支持可重复读

第一个cmd
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from custom;
+----+---------+---------+-------+-------+------+
| id | address | cusName | email | phone | sex  |
+----+---------+---------+-------+-------+------+
|  1 | a       | NULL    | NULL  | NULL  | NULL |
+----+---------+---------+-------+-------+------+
1 row in set (0.00 sec)

mysql> select * from custom;
+----+---------+---------+-------+-------+------+
| id | address | cusName | email | phone | sex  |
+----+---------+---------+-------+-------+------+
|  1 | a       | NULL    | NULL  | NULL  | NULL |
+----+---------+---------+-------+-------+------+
1 row in set (0.00 sec)

第二个cmd
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update custom set cusname='a';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from custom;
+----+---------+---------+-------+-------+------+
| id | address | cusName | email | phone | sex  |
+----+---------+---------+-------+-------+------+
|  1 | a       | a       | NULL  | NULL  | NULL |
+----+---------+---------+-------+-------+------+
1 row in set (0.00 sec)

删除

两个cmd同时开启事务,一个进行查询,另一个进行删除并且commit,第一个再一次查询,结果不变,delete操作支持可重复读
注意,如果是truncate,则会等待其它事务执行完后才能执行,具体原因不明确

第一个cmd
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from custom;
+----+---------+---------+-------+-------+------+
| id | address | cusName | email | phone | sex  |
+----+---------+---------+-------+-------+------+
|  1 | a       | NULL    | NULL  | NULL  | NULL |
+----+---------+---------+-------+-------+------+
1 row in set (0.00 sec)

第二个cmd
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from custom where id=1;
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.02 sec)

查询新增修改查询

两个cmd同时开启事务,一个进行查询,另一个进行新增并且commit,第一个再一次查询,结果不变,然后执行更新另一个新增的数据,再一次查询,能够查询到另一个新增的数据,原因不明确

第一个cmd
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from custom;
Empty set (0.02 sec)

mysql> select * from custom;
Empty set (0.02 sec)

mysql> update custom set cusname='a' where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from custom;
+----+---------+---------+-------+-------+------+
| id | address | cusName | email | phone | sex  |
+----+---------+---------+-------+-------+------+
|  2 | a       | a       | NULL  | NULL  | NULL |
+----+---------+---------+-------+-------+------+
1 row in set (0.00 sec)

第二个cmd
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into custom(address) values('a');
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

串行

打开两个cmd,连接mysql数据库,修改隔离级别

mysql> set session transaction isolation level Serializable;
Query OK, 0 rows affected (0.00 sec)

mysql> set global transaction isolation level Serializable;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| SERIALIZABLE          |
+-----------------------+
1 row in set (0.00 sec)

mysql> select @@session.tx_isolation;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| SERIALIZABLE           |
+------------------------+
1 row in set (0.00 sec)

插入/修改

一个进行查询,另一个进行插入,插入会等待锁,第一个查询commit以后,插入操作才能继续
总之,如果第一个进行全表查询,则第二个cmd进行任何修改操作都需要等第一个提交后才能进行,但是如果只查询特定的行,则第二个cmd可修改其他行而无需等待,可以新增无需等待

第一个
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from custom;
+----+---------+---------+-------+-------+------+
| id | address | cusName | email | phone | sex  |
+----+---------+---------+-------+-------+------+
|  2 | a       | a       | NULL  | NULL  | NULL |
+----+---------+---------+-------+-------+------+
1 row in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)
第二个
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from custom;
+----+---------+---------+-------+-------+------+
| id | address | cusName | email | phone | sex  |
+----+---------+---------+-------+-------+------+
|  2 | a       | a       | NULL  | NULL  | NULL |
+----+---------+---------+-------+-------+------+
1 row in set (0.00 sec)

mysql> insert into custom(address) values('b');
Query OK, 1 row affected (5.89 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

总结

在日常系统使用中,我们数据库隔离级别基本都是read commited,读可提交,当然如果有特殊的需要可以选择其他,关于重复读和串行有使用场景的朋友可以提出来,不胜感激。

MySQL事务隔离级别详解 全局事务要求在其中的所有参与的事务要么都提交,要么都回滚,这对于事务原有的 ACID 要求又有了提高。解决幻读的方式有很多,但是它们的核心思想就是一个事务在操作某张表数据的时候,另外一个事务不允许新增或者删除这张表中的数据了。从上面对 SQL 标准定义了四个隔离级别的介绍可以看出,标准的 SQL 隔离级别定义里,REPEATABLE-READ(可重复读)是不可以防止幻读的。还是刚才上面的读已提交的图,虽然避免了读未提交,但是却出现了,一个事务还没有结束,就发生了 不可重复读问题。并不会有任何性能损失。 阅读详情

相关推荐

深入解析MySQL事务隔离级别及其实现原理

在数据库管理系统中,事务(Transaction)是保证数据一致性的重要机制。而事务隔离级别则是决定多个事务之间如何相互影响的关键。MySQL作为常用的关系型数据库,其事务隔离级别和实现机制在许多业务场景中起着至关重要的作用。本文将详细介绍MySQL的事务隔离级别、常见问题及其底层实现原理,帮助读者更好地理解和应用事务。

fudaihb的博客 2424

数据库之事务隔离级别详解

儿子某一天去消费,花了8千元,然后他的父亲去查看他今天的消费记录(全表扫描,儿子事务开启),看到确实是花了8千元,就在这个时候,儿子花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。但是转账时父亲不小心按错了数字,按成10万/月,该钱已经打到儿子的账户,但是事务还没有提交,就在这时,儿子去查看自己的储蓄卡,发现转多了9万,以为凭空多了9万非常高兴。事务的隔离性是指在并发执行的多个事务中,每个事务的执行互不影响,每个事务都有自己独立的空间进行操作。儿子看到的是父亲还没提交事务时的数据。

qq_39939541的博客 1万+

4种事务的隔离级别

• 并发事务之间相互干扰,可能导致事务出现读脏,不可重复度,幻读等问题 • InnoDB实现了SQL92标准中的四种隔离级别 (1)读未提交:select不加锁,可能出现读脏; (2)读提交(RC):普通select快照读,锁select /update /delete 会使用记录锁,可能出现不可重复读; (3)可重复读(RR):普通select快照读,锁select /update /delete 根据查询条件情况,会选择记录锁,或者间隙锁/临键锁,以防止读取到幻影记录; (4)串行化:select隐式转化为select ... in share mode,会被update与delete互斥; • InnoDB默认的隔离级别是RR,用得最多的隔离级别是RC

并发事务带来哪些问题

在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据...

lxw1844912514的博客 2881

微纳加工技术中的自对准硅化物(Silicide)工艺:关键步骤与应用场景解析

本文深入解析了微纳加工技术中的自对准硅化物(Silicide)工艺,详细介绍了其关键步骤与应用场景。从表面清洁、金属沉积到两步退火法,全面拆解工艺全流程,并探讨了不同技术节点下的工艺演进。文章还提供了实际应用中的问题排查方法和新兴技术对Silicide工艺的挑战,为芯片制造领域的工程师提供了实用参考。

weixin_30613727的博客 428

糖果【贪心】

【问题描述】 有N(1≤N <100,000)N(1≤N~<100,000)N(1≤N <100,000)种不同类型的糖果,每种糖果数量无限多。第i种糖果每颗的价格是Pi(1≤Pi≤1018),有Ci(1≤Ci≤1018)P_i(1≤P_i≤10^{18}),有C_i (1≤C_i≤10^{18)}Pi​(1≤Pi​≤1018),有Ci​(1≤Ci​≤1018)头牛想吃这种糖果。 FarmerJohnFarmer JohnFarmerJohn拥有金钱BBB元(1≤B≤1

算法小猪的博客 791

事务隔离级别

不同的事务隔离级别提供了不同的访问控制和限制程度,未提交读级别允许一个事务读取另一个事务尚未提交的数据,提交读级别要求一个事务只能读取已经提交的数据,可重复读级别要求一个事务只能读取已经提交的数据并且在事务执行期间多次读取同一数据时返回相同的结果,而序列化级别则要求所有事务串行执行,完全隔离,最大程度地保证了数据的一致性和可靠性。但是,如果在事务B查询操作期间,事务A执行了增加操作,那么事务B再次查询账户A的余额时,读取到的值就会变成1100元,因此在事务B中读取同一行数据的结果是不一致的。

all_about_WZY的博客 913

【通信协议】I2C总线(一主多从)

I2C总线(一主多从)之软件模拟代码详解

m0_75090944的博客 9835

事务隔离级别[转载]

事务隔离级别 事务隔离级别分为4个级别,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable ,这四个级别可以逐个解决脏读 、不可重复读 、幻读这几类问题。 Read UnCommitted(读未提交) 最低的隔离级别。一个事务可以读取另一个事务并未提交的更新结果。 Read Committed(读提...

大白的博客 233

yakit 验证码识别 进行webfuzzer

在渗透测试的过程中,我们可能需要对管理员密码进行枚举,或者密码喷洒的时候,遇到验证码就很烦。有没有自动化识别验证码的办法呢?有的,兄弟,有的。验证码的识别率很低,captcha-killer-modified对算术验证码识别正确率非常低,还会识别成乱七八糟的结果,这就非常麻烦。因为你不知道到底是验证码不对,还是密码不对。这是 ddddocr 识别率的问题,如果师傅们找到准确度更高的工具,完全可以替换上去。

Arkmornings的博客 1663

目前固态激光雷达在机器人领域的应用难点汇总

固态激光雷达在机器人领域面临性能与成本的双重挑战:探测性能上,动态范围不足(60-80dB)导致高/低反射物体识别困难,近距盲区(30-50cm)与长距精度(±3cm)矛盾突出;结构上视场角与点云密度难以平衡,多雷达拼接又带来同步误差。成本方面,核心元件(SPAD/OPA芯片)良率低(<50%)、校准工序复杂,单机成本超200美元。环境适应性上,粉尘附着、振动偏移(±2°)和光衰(1万小时衰减15%)制约可靠性。

start_up_go的博客 478

MySQL 事务特性、四种隔离级别 (图示每一步的操作)和产生的问题

文章目录一、事务的基本要素(ACID)二、事务的并发问题三、MySQL事务隔离级别四、用例子说明各个隔离级别的情况4.1、读未提交:4.2、读已提交4.3、可重复读4.4、串行化五、补充: 本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一、事务的基...

猎人在吃肉 2310

【ComfyUI】SD1.5 + ControlNet 边缘检测融合动漫转真人

本文介绍了一个基于ComfyUI的动漫转真人图像生成工作流,通过多模型协同实现高质量的二次元图像转换。该工作流集成了Canny线稿预处理、ControlNet结构控制、VAE编码解码和人脸精细化处理等核心环节,采用majicmixRealistic_v7作为主模型,配合yolov8、SAM等辅助模型。整个流程包含11个标准化步骤,从图像输入、预处理到最终超分输出,通过ControlNet引导和CLIP语义控制确保生成图像的写实感和结构准确性,特别针对人脸区域进行专业优化,最终可输出高分辨率写实人像。

Mr数据杨 1118

【MySql】MySql事务及隔离级别

MySql事务隔离级别

酷酷的馫博客 1万+

Python学习第1天:初识Python

Python 作为目前最流行的编程语言之一,凭借其简洁优雅的语法和强大的生态系统,成为了无数开发者的首选。本系列文章将带你从零基础入门,逐步掌握 Python 编程的核心技能。今天我们先来认识 Python,并安装好开发环境。Python(英式发音:/ˈpaɪθən/;美式发音:/ˈpaɪθɑːn/)是由荷兰人吉多·范罗苏姆(Guido von Rossum)发明的一种编程语言,是目前世界上最受欢迎和拥有最多用户的编程语言。

tigerhhzz的博客 429

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MySQL 事务四大特性和事务隔离级别

MySQL 事务具有四个特性:原子性、一致性、隔离性、持久性,这四个特性简称 ACID 特性一、原子性(Atomicity ):一个事务是一个不可再分割的整体,要么全部成功,要么全部失败事务在数据库中就是一个基本的工作单位,事务中包含的逻辑操作(SQL 语句),只有两种情况:成功和失败。事务的原子性其实指的就是这个逻辑操作过程具有原子性,不会出现有的逻辑操作成功,有的逻辑操作失败这种情况二、一致性(Consistency ):一个事务可以让数据从一种一致状态切换到另一种一致性状态举例说明:张三给李四转账 1

辰风沐阳 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【MySQL事务】事务的隔离级别

正在进行中且尚未提交。

2301_80224556的博客 2119

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MySQL中的事务隔离级别有哪些

可能发生脏读、不可重复读、幻读,性能最高但安全性最低。:防止脏读,但可能发生不可重复读和幻读。REPEATABLE READ(MySQL 默认):防止脏读和不可重复读,MySQL 还能避免幻读,适用于大多数高并发业务。:所有并发问题都能避免,但性能最差。MySQL 默认采用,主要是因为 MySQL 通过MVCC解决了大部分的并发问题,既能保持较高的事务隔离级别,又不会影响太多的性能。读未提交(Read Uncommitted)该级别允许事务读取其他事务尚未提交的数据(脏读)。

Weiki的博客 5115

【MySQL进阶之路】事务的隔离级别

其中隔离级别越严格,安全性越高,但数据库的并发性能也就越低,往往需要在两者之间找一个平 衡点。不可重复读的重点是修改和删除:同样的条件, 你读取过的数据,再次读取出来发现值不一样了幻读的重点在于新增:同样的条件, 第1次和第2次读出来的记录数不一样说明: mysql 默认的隔离级别是可重复读,一般情况下不要修改 上面的例子可以看出,事务也有长短事务这样的概念。事务间互相影响,指的是事务在并行执行的 时候,即都没有commit的时候,影响会比较大。隔离级别描述可能出现的问题。

2301_79796701的博客 2087

MySql中的事务、MySql事务详解、MySql隔离级别

思考:我去银行给朋友汇款,我卡上有100元,朋友卡上50元,我给朋友转账50元,如果我的钱刚扣,而朋友的钱又没加时,网线断了, 怎么办(Transaction)是数据库管理系统(DBMS)中的一个核心概念,它确保了一系列数据库操作要么全部成功,要么全部失败,从而维护数据库的完整性和一致性。MySQL在5.5版本开始,就将InnoDB引擎作为默认存储引擎。由于Mysql中的事务是存储引擎实现,而且只有InnoDB支持事务。

m0_74825526的博客 1113

MySQL 事务隔离级别_mysql事务隔离级别最高

❝如果隔离级别为序列化,则用户之间通过一个接一个顺序地执行当前的事务,这种隔离级别提供了事务之间最大限度的隔离。❝在可重复读在这一隔离级别上,事务不会被看成是一个序列。不过,当前正在执行事务的变化仍然不能被外部看到,也就是说,如果用户在另外一个事务中执行同条 SELECT 语句数次,结果总是相同的。(因为正在执行的事务所产生的数据变化不能被外部看到)。❝READ COMMITTED 隔离级别的安全性比 REPEATABLE READ 隔离级别的安全性要差。

2501_90392009的博客 1669

MySql事务隔离级别

序列化可重复读提交读未提交读幻读:两个事务,当事务A(READ COMMITTED 事务任意都行),事务B(REPEATABLE READ) ,当事务A提交执行了开始事务操作,但是未对数据进行操作;事务B此时也同步开启了事务,但是只是查询了一下数据;而事务A在此时对数据进行了操作,并提交了。在事务B中还是读取之前的数据,导致在操作数据的时候出现了异常现象;这个就好理解了,当事务AREAD COMMITTED,事务B(事务任意都行);当事务A开始事务之后,查询了数据;

qq_43070052的博客 969
上一篇: spring事务传播之NESTED
下一篇: spring aop 自动创建代理BeanNameAutoProxyCreator详解
非洲_bear
博客等级 码龄15年 23粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值