自语之Mysql隐式提交和事务隔离级别的关系
前言
笔者自诩对Mysql的知识积累已经很不错了,现在看来不过是对CRUD操作比较熟悉罢了。
用了那么久的Mysql, 直到前几日才知道隐式提交和事务隔离级别的联系(内幕)。
(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!)
那么,什么是隐式提交?
顾名思义, 就是偷偷的提交事务(手动狗头)。
讲道理在Mysql中, 开启一个事务后, 需要使用commit关键字进行提交事务,这种提交方式叫做显式提交。但是,我们在当前事务中输入某些语句之后, 会造成当前事务悄悄的提交,那么这种导致事务悄悄提交的情况, 我们称为隐藏提交。
那么, 触发隐式提交的语句有哪些?
使用
create
、alter
、delete
语句去修改数据库、表、视图、存储过程等数据库对象的时候,就会隐式提交当前事务。使用
ALTER USER
、CREATE USER
、DROP USER
、GRANT
、RENAME USER
、REVOKE
、SET PASSWORD
等语句, 也会触发隐式提交。当然有很多操作多会造成隐式提交, 经常使用的则是对数据库表的增、删、改操作。
delete ... from
update set from
insert into ....
事务并发带来的问题
在笔者之前的知识体系中, 只是知道事务并发的概念,却不知是Mysql为什么会发生事务的并发。请原谅笔者, 到现在才知道事务的并发,是因为Mysql的C/S架构引起的……
- 事务并发诱因:
讲道理, Mysql是一个C/S架构, 即客户端/服务器架构。所以,在使用过程中, 肯定会出现多个客户端访问服务器的场景。其中,每一个客户端向服务端发起访问, 可以称为建立一次数据库连接(session会话)。而每一个连接都可以发起数据库的事务。
所以,不同的数据库连接之间的事务,有可能是并发执行的。
我们都知道,一旦产生并发有可能会对共享数据的状态,产生巨大的影响。
对于一次数据库连接而言,当两个事务同时操作同一种表的数据的时候, 可能会产生以下问题:
create table X (id int(10),name varchar(10)
);
insert into X values(1, '张三');
肮读/写:一个事务能够读取/修改, 另一个事务未提交的数据。
不可重复读:同一个事务内, 根据同一个条件对同一个行记录进行查询,但是搜出来的结果却不一致。
- 在数据库连接1中, 事务T1根据查询条件id = 1, 查询行记录name的值为张三, 且T1未提交。之后, 在另外一个数据库连接中, 根据条件id = 1, 把行记录name的值更新为李四。
紧接着, 事务T1根据查询条件id = 1, 再次查询行记录name的值, 结果显示为李四。这种情况, 称为不可重复读。
注意:在上图的右边更新语句, 触发了隐式提交。
幻读:同一个事务内, 多次查询相同的条件返回的结果集不一样。
在数据库连接1中, 事务T1先根据查询H的所有记录, 这时返回结果为张三。之后, 另外一个事务T2对表插入李四这条记录。此时事务T1再次查询H表的所有记录, 返回的结果为张三和李四, 此时发生这种情况称为幻读。
写到这里, 并发带来的问题差不多描述完了。
那么, 如何解决事务并发所带来的问题呢?事务的隔离级别, 了解一下!
事务的隔离级别
如果, 在事务隔离性方面, 直接一杆子打死。要求,所有的并发事务都必须串行化执行(一个接一个, 即不允许并发), 那么这样做会造成执行效率过低。
所以, 在性能和隔离性方面, 我们需要一种折中的办法, 即允许并发问题的出现(脏读、不可重复读、幻读), 根据出现的问题, 设置隔离强度。
在SQL标准中,具有四种隔离级别, 分别是读已提交、读未提交、可重复读、可串行化。
READ UNCOMMITTED
:可能发生脏读、不可重读读、幻读READ COMMITTED
:解决脏读, 可能会发生不可重复读、幻读REPEATABLE READ
:解决脏读、不可重复读, 可能发生幻读SERIALIZABLE
:串行化执行, 并不会发生并发问题。即, 解决脏读, 不可重复读、幻读。
上述的四种隔离级别, 是所有数据库通用的标准。因为不同数据库, 隔离级别的支持情况并不一样。
但是, Mysq包含且支持四种上述的四种隔离级别。
唯一不同的是, Mysql在可重复读(REPEATABLE READ)的隔离级别下, 是可以解决幻读问题。所以, Mysql的默认隔离级别为可重复读!
总结
根据事务并发带来的问题的严重性, 可以适度选择相应的隔离级别来解决。
脏写是并发事务带来的最最最严重的问题, 所以四种隔离级别中, 直接禁止脏写的出现。
在Mysql标准中的可重复读, 是可以解决幻读问题。
幻读主要强调, 使用同一个条件多次进行查询后, 返回之前查询结果中, 没有获取到的记录。
比如这种场景, 算不算幻读?
- 事务T1, 第一次查询得到结果集合:A、B、C、D
- 期间, 事务T2, 删除了C、D记录
- 事务T2, 第二次查询得到结果集合:A、B
其实, 上述情况属于不可重复读, 而不是幻读。
自语之Mysql隐式提交和事务隔离级别的关系相关推荐
- mysql begin rollback_事务控制语句,begin,rollback,savepoint,隐式提交的SQL语句
事务控制语句 在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作.因此开始一个事务,必须使用BEGIN.START TRANSACTION,或者执行SE ...
- 事务控制语句,begin,rollback,savepoint,隐式提交的SQL语句
事务控制语句 在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作.因此开始一个事务,必须使用BEGIN.START TRANSACTION,或者执行SE ...
- 事务(ACID)、并发一致性问题(丢失修改、读脏数据、不可重复读、幻影读)、封锁(封锁粒度、类型、协议、MySQL 隐式与显示锁定)
1. 事务 1.1 概念 事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚. 1.2 ACID 1.2.1 原子性(Atomic ...
- mysql 隐式提交事务_MySQL的SQL语句 -事务性语句和锁定语句(2)- 致使隐式提交的语句...
致使隐式提交的语句html 本节中列出的语句(以及它们的任何同义词)隐式结束当前会话中活动的任何事务,就像在执行语句以前执行了 COMMIT 同样.mysql 大多数这些语句在执行后也会致使隐式提交. ...
- mysql 隐式锁和显示锁_锁的类型以及粒度,两段锁协议,隐式和显示锁
锁的粒度 行级锁 表级锁 应尽量只锁定需要修改的那部分数据,而不是所有资源.锁定的数据量越少,发生锁争用的可能性就越小,并发行就越高. 加锁需要消耗资源,锁的各种操作都会增加系统开销.因此锁的粒度越小 ...
- mysql 隐式失误_评“MySQL 隐式转换引起的执行结果错误”
今天看到一篇关于MySQL隐式转换引发执行结果错误的文章: ====================================================================== ...
- MySQL隐式转化整理
MySQL隐式转化整理 原文:http://www.cnblogs.com/rollenholt/p/5442825.html 前几天在微博上看到一篇文章:价值百万的 MySQL 的隐式类型转换感觉写 ...
- Oracle数据库的显示提交与隐式提交,针对oracle工具的自动提交机制
显示提交与隐式提交: oracle 在进行插入(insert).修改(update)和删除(delete)需要 commit 才会生效.其余的操作不需要 commit 就会生效. 需要 commit ...
- html5 提交from,刨根问底:HTML中form的隐式提交
有时在HTML页面form的input里按了回车键会提交该表单,并且form的submit按钮的click事件也会被触发.这是什么原理呢?是因为form的隐式提交(Implicit submissio ...
最新文章
- WCF学习笔记(基于REST规则方式)
- 第四讲 deque
- 我的小前端 (4)—— 多余字数用省略号显示
- 如何用matlab求方程的整数解
- 2017GAITC丨尖峰对话:AI的第三次寒冬会不会到来?
- day36 03-Hibernate检索方式:排序、参数绑定、投影查询
- 华为开发者被批评在 Linux 内核刷 KPI
- [转载] opencv学习笔记7:图像加法与图像融合
- 批处理转成可执行文件的软件
- wxwindows qt
- python写一个简单的CMS识别
- 共轭、转置,共轭转置和逆矩阵的性质
- 苹果和华为如何隔空传照片
- Java-HelloWorld
- P3373(线段树2)
- 包含C/C++开发文档的Docset文档库
- C和C++和Java的一些区别
- 弘辽科技:拼多多券后价影响报活动吗?怎么平衡?
- 信号与系统sa函数求积分_信号与系统
- 使用软碟通软件制作U盘启动盘