今天咱们说说事务,相信大家都知道事务的 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. [转]Vue CLI 3搭建vue+vuex 最全分析

    原文地址:https://my.oschina.net/wangnian/blog/2051369 一.介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.有三个组件: CLI:@ ...

  2. C#中 ??、 ?、 ?: 、?.、?[ ] 问号

    1. 可空类型修饰符(?) 引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; 是正确的,int i=null; 编译器就会报错.为了使值类型也 ...

  3. osg::Node源码

    /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield * * This library is open source ...

  4. Flutter中管理路由栈的方法和应用

    原文地址:https://www.jianshu.com/p/5df089d360e4 本文首先讲的Flutter中的路由,然后主要讲下Flutter中栈管理的几种方法. 了解下Route和Navig ...

  5. Python 推导式详解

    各种推导式详解 推导式的套路 之前我们已经学习了最简单的列表推导式和生成器表达式.但是除此之外,其实还有字典推导式.集合推导式等等. 下面是一个以列表推导式为例的推导式详细格式,同样适用于其他推导式. ...

  6. react-native-typescript-项目环境搭建

    1.yarn global add create-react-native-app //全局安装 2.create-react-native-app 项目名称 3.yarn add typescrip ...

  7. spring项目配置双数据源读写分离

    我们最早做新项目的时候一直想做数据库的读写分离与主从同步,由于一些原因一直没有去做这个事情,这次我们需要配置双数据源的起因是因为我们做了一个新项目用了另一个数据库,需要把这个数据库的数据显示到原来的后 ...

  8. JWT黑名单和白名单

    单点登录系统 单点登录系统保存了用户的登录名和密码,上网用户在单点登录系统中认证成功后,就可以直接登录各个业务系统. 1. 用户使用单点登录系统的登录界面,输入用户名和密码登录成功后, 单点登录系统为 ...

  9. Serializer组件

    Serializer组件 一 .序列化器-Serializer 作用: 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 反序列化,把客户端发送过来的数据,经过req ...

  10. 【转】基于FPGA的Sobel边缘检测的实现

    前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Can ...