前言

笔者自诩对Mysql的知识积累已经很不错了,现在看来不过是对CRUD操作比较熟悉罢了。

用了那么久的Mysql, 直到前几日才知道隐式提交和事务隔离级别的联系(内幕)。

(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!)

那么,什么是隐式提交?

  • 顾名思义, 就是偷偷的提交事务(手动狗头)。

  • 讲道理在Mysql中, 开启一个事务后, 需要使用commit关键字进行提交事务,这种提交方式叫做显式提交。但是,我们在当前事务中输入某些语句之后, 会造成当前事务悄悄的提交,那么这种导致事务悄悄提交的情况, 我们称为隐藏提交。

  • 那么, 触发隐式提交的语句有哪些?

    • 使用createalterdelete语句去修改数据库、表、视图、存储过程等数据库对象的时候,就会隐式提交当前事务。

    • 使用ALTER USERCREATE USERDROP USERGRANTRENAME USERREVOKESET 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隐式提交和事务隔离级别的关系相关推荐

  1. mysql begin rollback_事务控制语句,begin,rollback,savepoint,隐式提交的SQL语句

    事务控制语句 在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作.因此开始一个事务,必须使用BEGIN.START TRANSACTION,或者执行SE ...

  2. 事务控制语句,begin,rollback,savepoint,隐式提交的SQL语句

    事务控制语句 在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作.因此开始一个事务,必须使用BEGIN.START TRANSACTION,或者执行SE ...

  3. 事务(ACID)、并发一致性问题(丢失修改、读脏数据、不可重复读、幻影读)、封锁(封锁粒度、类型、协议、MySQL 隐式与显示锁定)

    1. 事务 1.1 概念 事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚. 1.2 ACID 1.2.1  原子性(Atomic ...

  4. mysql 隐式提交事务_MySQL的SQL语句 -事务性语句和锁定语句(2)- 致使隐式提交的语句...

    致使隐式提交的语句html 本节中列出的语句(以及它们的任何同义词)隐式结束当前会话中活动的任何事务,就像在执行语句以前执行了 COMMIT 同样.mysql 大多数这些语句在执行后也会致使隐式提交. ...

  5. mysql 隐式锁和显示锁_锁的类型以及粒度,两段锁协议,隐式和显示锁

    锁的粒度 行级锁 表级锁 应尽量只锁定需要修改的那部分数据,而不是所有资源.锁定的数据量越少,发生锁争用的可能性就越小,并发行就越高. 加锁需要消耗资源,锁的各种操作都会增加系统开销.因此锁的粒度越小 ...

  6. mysql 隐式失误_评“MySQL 隐式转换引起的执行结果错误”

    今天看到一篇关于MySQL隐式转换引发执行结果错误的文章: ====================================================================== ...

  7. MySQL隐式转化整理

    MySQL隐式转化整理 原文:http://www.cnblogs.com/rollenholt/p/5442825.html 前几天在微博上看到一篇文章:价值百万的 MySQL 的隐式类型转换感觉写 ...

  8. Oracle数据库的显示提交与隐式提交,针对oracle工具的自动提交机制

    显示提交与隐式提交: oracle 在进行插入(insert).修改(update)和删除(delete)需要 commit 才会生效.其余的操作不需要 commit 就会生效. 需要 commit ...

  9. html5 提交from,刨根问底:HTML中form的隐式提交

    有时在HTML页面form的input里按了回车键会提交该表单,并且form的submit按钮的click事件也会被触发.这是什么原理呢?是因为form的隐式提交(Implicit submissio ...

最新文章

  1. WCF学习笔记(基于REST规则方式)
  2. 第四讲 deque
  3. 我的小前端 (4)—— 多余字数用省略号显示
  4. 如何用matlab求方程的整数解
  5. 2017GAITC丨尖峰对话:AI的第三次寒冬会不会到来?
  6. day36 03-Hibernate检索方式:排序、参数绑定、投影查询
  7. 华为开发者被批评在 Linux 内核刷 KPI
  8. [转载] opencv学习笔记7:图像加法与图像融合
  9. 批处理转成可执行文件的软件
  10. wxwindows qt
  11. python写一个简单的CMS识别
  12. 共轭、转置,共轭转置和逆矩阵的性质
  13. 苹果和华为如何隔空传照片
  14. Java-HelloWorld
  15. P3373(线段树2)
  16. 包含C/C++开发文档的Docset文档库
  17. C和C++和Java的一些区别
  18. 弘辽科技:拼多多券后价影响报活动吗?怎么平衡?
  19. 信号与系统sa函数求积分_信号与系统
  20. 使用软碟通软件制作U盘启动盘

热门文章

  1. java轮子_java造车轮是什么意思?
  2. 微型四轴DIY机架,轻巧稳固耐摔,通用720空心杯电机,9厘米轴距
  3. 世界最迷人的白色海岸线
  4. Java多线程自我小结
  5. 【我的故事】一个还不成熟的女程序员的苦恼
  6. 手机、彩电巨头跨界互博
  7. 全球及中国混合动力汽车产业投资决策与竞争态势研究报告2022版
  8. 网页设计三剑客(总结)
  9. LINUXUNIX 中文著名网站
  10. Rabin-Karp算法