今天咱们说说事务,相信大家都知道事务的 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. Android NFC M1卡读写&芯片卡读写(CPU卡读写)(RFID读写)

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/sgn5200/article/detai ...

  2. jdbc如何处理事务

    Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务:当事务完成后用commit()显式提交事务:如果在事务处理过程中发生异常则通过rollb ...

  3. pytorch保证每次运行使用的随机数都相同的方法

    其实在代码的开头添加下面几句话即可: # 保证训练时获取的随机数都是一样的 init_seed = torch.manual_seed(init_seed) torch.cuda.manual_see ...

  4. python web开发——django学习(二)orm介绍与model检查

    原始是这样连接数据库的: 现在改用django orm (1)先在setting里配置app (2)在modle.py里建model class UserMessage(models.Model): ...

  5. 【视频开发】【CUDA开发】英伟达CUVID硬解,并通过FFmpeg读取文件

    虽然FFmpeg本身有cuvid硬解,但是找不到什么好的资料,英伟达的SDK比较容易懂,参考FFmpeg源码,将NVIDIA VIDEO CODEC SDK的数据获取改为FFmpeg获取,弥补原生SD ...

  6. java.lang.IllegalArgumentException: TLSv1.2

    通过HTTPClient4.5,基于JDK1.6 new SSLConnectionSocketFactory(builder.build(), new String[]{"SSLv2Hel ...

  7. OpenJudge 2755:神奇的口袋

    总时间限制: 10000ms 内存限制: 65536kB 描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体 ...

  8. qmake, makefile, make是什么东东,makefile简介!

    qmake是一个协助简化跨平台开发的构建过程 的工具,Qt附带的工具之一 .qmake能够自动生成Makefile.Microsoft Visual Studio 专案文件 和 xcode 专案文件. ...

  9. tcpdump网络调试

    简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...

  10. MVC与MTV模型

    MVC与MTV模型 MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务 ...