MySQL事务和事务的四种隔离级别 for INNODB
发表于:2025-02-07 作者:千家信息网编辑
千家信息网最后更新 2025年02月07日,什么是事务一组原子性的SQL语句,可以提交或回滚的原子工作单元 。当事务对数据库进行多次更改时,要么在提交事务后所有更改成功,要么在回滚事务时撤消所有更改。事务特性ACID特性A: atomicity
千家信息网最后更新 2025年02月07日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-READSERIALIZABLE
2.服务器选项中指定
在/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安全错误
数据库的锁怎样保障安全
网络安全主题手抄报简笔画
方正电子图书数据库
湖州工业软件开发工具
宿州医院软件开发
军营网络安全宣传演讲
服务器管理怎么不自启
人才优势 互联网科技
人大数据库使用说明
网络安全知识和防范技巧
数据库的差并交
黑龙江先进软件开发项目信息
杀死服务器是什么意思
国家信息网络安全相关股票
互联网科技有什么套路
放心的财务软件开发定制
知网数据库在哪儿
中国结算数据库在哪
人教版信息技术网络安全章节
进入服务器桌面
南京服务器机房搭建报价
黑魂3多人服务器什么时候开
德惠通用网络技术服务参考价格
深度学习需要用数据库嘛
网络安全知识手绘画
巩固加强网络安全
西城区管理软件开发包括什么
微信健康码服务器错误打不开
我爱搜网络技术交流
停车云坐席软件开发
保险公司两会期间网络安全排查