今天咱们说说事务,相信大家都知道事务的 ACID (Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)。

原子性:表示一个事务不可在分割,而且事务中的操作要么一起成功,要么一起失败;

一致性:表示事务前后数据的完整性必须保持一致;

持久性:表示事务一旦进行提交,那么数据的就改便会永久保存,即使数据库出现宕机也不会任何影响。

前面三个很好理解,那咱们再说说事务的隔离性,事务的隔离就是表示事务与事务之间不会相互干扰。但是多事务的情况下,还是很容易出现脏读、不可重复读以及幻读的问题。我们简单的解释一下这几个词,

脏读:当数据库中一个事务A正在修改一个数据但是还未提交或者回滚,另一个事务B 来读取了修改后的内容并且使用了,之后事务A提交了,此时就引起了脏读。
此情况仅会发生在: 读未提交的的隔离级别.

不可重复读:在一个事务A中多次操作数据,在事务操作过程中(未最终提交),事务B也才做了处理,并且该值发生了改变,这时候就会导致A在事务操作的时候,发现数据与第一次不一样了。 就是不可重复读。
此情况仅会发生在:读未提交、读提交的隔离级别.

幻读:一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样.一般解决幻读的方法是增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读。
此情况会回发生在:读未提交、读提交、可重复读的隔离级别。

说完上面的问题,咱们再说说事务具体的隔离级别,事务隔离级别越高效率就越低。事务隔离的级别大致分为以下几种,

读未提交(read uncommited)、读提交((read commited)、可重复读(repeatable read)以及串行化(serializable)。那么我来解释一下这几种隔离级别,

读未提交:表示一个事务没有提交,其他事务便能读取到它所修改的内容;

读提交:表示一个事务必须提交了,其他事务才能读取到它所修改的内容;

可重复读:表示一个事务从开始到执行结束看到的数据与此事务开启时看到的数据是一致的;

串行化:表示一个事务中不管是读写操作都会加锁,读会加读锁,写会加写锁,如果多个事务出现读写冲突的时候,那么必须等前一个事务执行完成,才能执行下一个事务。

可以下面代码查询你当前数据库的事务隔离级别

mysql> show variables like 'transaction_isolation';
Empty set, 1 warning (0.13 sec)

mysql 默认是为空的。你可以将启动参数 transaction-isolation 的值设置成 READ-COMMITTED ,这里我也建议大家把事务隔离设置成 “读提交”。当然具体设置成什么级别还得根据业务来。

事务隔离性的实现原理

在数据库中会创建一个视图,访问的时候以试图的逻辑结果为准。

在 “可重复读”  隔离级别下,这个视图是在这个事务启动时创建的,并且从始至终都是在用这个视图,原因就是 “事务从开始到执行结束看到的数据与此事务开启时看到的数据是一致的 ”;

在 “读提交” 隔离级别下,这个视图是在每个sql语句开始执行的时候创建的;

这里需要注意的是 在“读未提交” 隔离级别下,是没有视图概念的,因它直接取得就是最新得值;

“串行化” 隔离级别更没有视图得概念了,因为它直接加锁了,这样避免其他事务得并行访问。

事务隔启动方式

Mysql的事务启动方式有以下几种,

1、显式的启动事务,使用 begin 或者 start transation ,然后还有 begin 或者 start commit 事务提交,begin 或者 start rollback 事务回滚;

2、也可以设置自动提交,set autocommit=0表示设置为事务关闭自动提交,如果为 1 则表示启动自动提交,当然自动提交事务的前提必须是要开启事务,所以这里就多了一步操作,使用 begin 开启事务。如果你认为这样很麻烦的话,你也可以执行 commit work and chain ,表示自动提交,并自动启动下一个事务。

好啦,今天就说到这里,如果有什么问题,欢迎大家一起研究讨论。

Mysql学习之事务的隔离性的更多相关文章

  1. 一文搞懂MySQL事务的隔离性如何实现|MVCC

    关注公众号[程序员白泽],带你走进一个不一样的程序员/学生党 前言 MySQL有ACID四大特性,本文着重讲解MySQL不同事务之间的隔离性的概念,以及MySQL如何实现隔离性.下面先罗列一下MySQ ...

  2. MySQL:事务的隔离性

    [参考文章]:数据库的事务特性及隔离级别 1. 事务的四大特性 1.1 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用 ...

  3. MySQL学习笔记-事务相关话题

    事务机制 事务(Transaction)是数据库区别于文件系统的重要特性之一.事务会把数据库从一种一致状态转换为另一个种一致状态.在数据库提交工作时,可以确保其要么所有修改都已经保存了,要么所有修改都 ...

  4. MySQL学习——管理事务

    MySQL学习——管理事务 摘要:本文主要学习了使用DCL语句管理事务的操作. 了解事务 什么是事务 事务是一组逻辑处理单位,可以是执行一条SQL语句,也可以是执行几个SQL语句. 事务用来保证数据由 ...

  5. 通过pymysql程序debug学习数据库事务、隔离级别

    问题 今天在使用pymysql连数据库的时候,出现了一个bug,查询数据库某个数据,但是在我在数据库中执行sql语句改变数据后,pymsql的查询依然没有发生改变. 代码如下: # 5.6.10 co ...

  6. mysql学习--1.事务

    转载自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/3984001.html 四.事务的四大特性(ACID) 4.1.原子性(Atomicity) 原子性是指事务 ...

  7. 【mysql】关于事务的隔离级别

    一.锁的种类 MySQL中锁的种类很多,有常见的表锁和行锁,也有新加入的Metadata Lock等等,表锁是对一整张表加锁,虽然可分为读锁和写锁,但毕竟是锁住整张表,会导致并发能力下降,一般是做dd ...

  8. mysql innodb引擎事务的隔离级别

    一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...

  9. MySQL学习之事务安全

    事务安全 事务概念 事务(transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit),事务通常由高级数据操纵语言或编程语言 书写的用户程序的执行所引起.事务有事务开始(b ...

随机推荐

  1. Oracle系列七 子查询

    子查询语法 SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table); 子查询 (内查询) 在 ...

  2. Qt开发经验小技巧21-30

    如果出现Z-order assignment: is not a valid widget.错误提示,用记事本打开对应的ui文件,找到为空的地方,删除即可. 善于利用QComboBox的addItem ...

  3. TWA那些事儿

    一.参考学习 https://developer.android.google.cn/studio/ https://juejin.im/post/5cf50755e51d455d850d3aa7

  4. KMP算法JS实现

    参考阮一峰的<字符串匹配的KMP算法>,用JS实现一版,备忘~ // 主串 let str1 = 'BBC ABCDAB ABCDABCDABDEDC'; // 模式串 let str2 ...

  5. PHP 23种设计模式

    学习PHP,对设计模式永远是逃不掉的:今天把php23种设计模式及其demo好好整理如下: 记录PHP关于23种设计模式的简单Demo. Demo地址:https://segmentfault.com ...

  6. Arduino硬件之NCF技术(近场通信技术)

    Arduino硬件之NCF技术(近场通信技术) 版权转载:https://blog.csdn.net/import_sadaharu/article/details/52437488 Android硬 ...

  7. SQL——WHERE子句

    一.WHERE字句的基本用法 WHERE字句用于筛选数据,提取满足条件的记录. WHERE字句的基本用法: SELECT * from 表名 WHERE 条件语句; 二.WHERE字句与删改查 演示s ...

  8. golang 实现定时任务

    在实际开发过程中,我们有时候需要编写一些定时任务.当然我们可以使用crontab命令实现我们的需求.但是这种方法不满足一些定制化场景,同时会依赖具体的操作系统环境. 定时任务 在golang中我们可以 ...

  9. 协议——SPI

    SPI(Serial Peripheral interface)是由摩托罗拉公司定义的一种串行外围设备接口,是一种高速.全双工.同步的通信总线,只需要四根信号线即可,节约引脚,同时有利于PCB的布局. ...

  10. 【题解】Luogu P4838 P哥破解密码

    原题传送门 考虑一个一个将字母加入字符串后面 设\(f[i][0/1/2]\)表示长度为\(i\)字符串末尾有\(0/1/2\)个A的种类数 易知: \(f[1][0]=1,f[1][1]=1,f[1 ...