MySQL事务和事务的四种隔离级别 for INNODB
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,什么是事务一组原子性的SQL语句,可以提交或回滚的原子工作单元 。当事务对数据库进行多次更改时,要么在提交事务后所有更改成功,要么在回滚事务时撤消所有更改。事务特性ACID特性A: atomicity
千家信息网最后更新 2025年12月03日MySQL事务和事务的四种隔离级别 for INNODB
什么是事务
一组原子性的SQL语句,可以提交或回滚的原子工作单元 。当事务对数据库进行多次更改时,要么在提交事务后所有更改成功,要么在回滚事务时撤消所有更改。
事务特性
ACID特性
- A: atomicity(原子性):整个事务中的所有操作要么全部成功,要么全部失败后回滚;
- C: consistency(一致性):整个数据库总是从一个一致性状态转换为另一个一致性状态;
- I: isolation(隔离性):一个事务所做的的操作在提交之前,是不被其它事务所见的;
- D: durability(持久性):事务一旦提交,其所做的修改会永久保存于数据库中。
事务生命周期
事务管理
显式启动事务:
BEGINBEGIN WORKSTART TRANSACTION结束事务:
# 提交COMMIT# 回滚ROLLBACK注:只有事务型的存储引擎的DML语句才能支持此类操作
自动提交:
默认为1,为0时设为非自动提交> show variables like 'autocommit';+---------------+-------+| Variable_name | Value |+---------------+-------+| autocommit | ON |+---------------+-------+1 row in set (0.00 sec)set autocommit={1|0}注:建议显式请求和提交事务,而不要使用"自动提交"功能。
事务支持保存点:
SAVEPOINT identifierROLLBACK [WORK] TO [SAVEPOINT] identifierRELEASE SAVEPOINT identifier查看事务:
# 查看当前的事务SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;#查看当前锁定的事务SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;#查看当前等锁的事务SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;事务隔离级别
MySQL事务支持四种隔离级别,从上至下更加严格
| 事务隔离级别 | 说明 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加读锁 |
|---|---|---|---|---|---|
| READ UNCOMMITTED | 可读取到未提交数据,产生脏读 | Yes | Yes | Yes | No |
| READ COMMITTED | 可读取到提交数据,但未提交数据不可读,产生不可重复读,即可读取到多个提交数据,导致每次读取的数据不一致 | No | Yes | Yes | No |
| REPEATABLE READ | 可重复读,多次读取数据都一致,产生幻读,即读取过程中,即使有其它提交的事务修改数据,仍只能读取到未修改前的旧数据。此为MySQL默认设置 | Yes | Yes | Yes | No |
| SERIALIZABLE | 可串行化,未提交的读事务阻塞修改事务(加读锁,但不阻塞读事务),或者未提交的修改事务阻塞读事务(加写锁,其它事务的读,写都不可以执行)。会导致并发性能差 | No | No | No | Yes |
MVCC和事务的隔离级别
MVCC(多版本并发控制机制)只在REPEATABLE READ和READ COMMITTED两个隔离级别下工作。其他两个隔离级别都和MVCC不兼容,因为READ UNCOMMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行。而SERIALIZABLE则会对所有读取的行都加锁
如何指定事务隔离级别
参考:https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tx_isolation
1.系统变量tx_isolation指定,默认为REPEATABLE-READ,有效范围:Global, Session
# 语法:set tx_isolatioin='value';# 有效值READ-UNCOMMITTEDREAD-COMMITTEDREPEATABLE-READSERIALIZABLE2.服务器选项中指定
在/etc/my.cnf文件的[mysqld]块中使用transaction-isolation选项设置[mysqld]transaction-isolation = value事务隔离级别验证
背景:通过两个终端显示启动两个事务来验证,用作验证的user表的表内容和表结构如下
mysql> desc user;+-------+------------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------+------------------+------+-----+---------+----------------+| id | int(10) unsigned | NO | PRI | NULL | auto_increment || name | varchar(30) | NO | | NULL | |+-------+------------------+------+-----+---------+----------------+2 rows in set (0.00 sec)mysql> select * from user;+----+-------+| id | name |+----+-------+| 2 | root || 3 | admin |+----+-------+2 rows in set (0.00 sec)1.READ UNCOMMITTED级别
2.READ COMMITTED级别
3.REPEATABLE READ级别
4.SERIALIZABLE级别
未提交的读事务阻塞修改事务(加读锁,但不阻塞读事务)
未提交的修改事务阻塞读事务(加写锁,其它事务的读、写都不可以执行)

注:此种事务隔离级别会导致并发性能差。
附加案例:如果一个事务产生了写锁,然后一直未结束事务,这样会导致其它事务的读、写都不可以执行,对于这种情况,可以找到未结束并且导致阻塞的事务,手动将其kill。
拿上面未提交的修改事务阻塞读事务的案例来验证
打开第三个会话执行以下操作
死锁
事务
级别
数据
隔离
阻塞
一致
两个
要么
验证
一致性
原子
可能性
数据库
支持
有效
成功
事务所
性能
案例
版本
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络技术的参考文献
问道手游自己怎么架设服务器
江西省第八届国家网络安全
gpu服务器资讯
南山区数据网络技术开发工艺
工程软件开发预算
网络安全演讲稿500字可复制
国安泰数据库能查什么
数据库关系代数表达
青海惠普服务器虚拟化定制
网络安全审核员最重要的是
oracle数据库更新列
ios系统软件开发服务多少钱
学习软件开发用什么显卡好
带数据库的文件能备份吗
学习数据库的作用和意义
好用的服务器开发模组
数据库备份与还原方案
软件开发常备网站
建立数据模型软件开发
网络安全专业收学生多的大学
分享经济软件开发
数据库是否是单线程的
安装数据库闪退
服务器多次点卡不出来
2022春考网络技术技能考什么
直播平台软件开发方案
祥云杯网络安全大赛缴费
宋朝思维导图软件开发
广州奥斯互联网科技有限公司