作者:logan

出自:SegmentFault 思否

一.事物的四个特性(ACID)

原子性(Atomicity):操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。eg:拿转账来说,假设用户A和用户B两者的钱加起来一共是20000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是20000,这就是事务的一致性。

● 一致性(Consistency):事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。

● 隔离性(Isolation):隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

● 持久性(Durability)**:当事务正确完成后,它对于数据的改变是永久性的。

二.事务的隔离性(Isolation)

隔离性引发的问题

1.脏读 事务A读取到了事务B未提交的数据

2.不可重复读 事务A读取到了事务B提交的数据

3.虚读 事务A读取到了事务B插入的数据

mysql中的数据库事务的隔离级别

Read uncommitted(最低级别,任何情况都无法保证。)

老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交。Analyse:实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是脏读。

Read committed(可避免脏读的发生。)程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务提交完)。程序员就会很郁闷,明明卡里是有钱的…Analyse:这就是读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。

Repeatable read(可避免脏读、不可重复读的发生。)

程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统事先检测到他的卡里有3.6万。这个时候他的妻子不能转出金额了。接下来收费系统就可以扣款了。Analyse:重复读可以解决不可重复读问题。写到这里,应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。

Serializable(可避免脏读、不可重复读、幻读的发生。)

程序员某一天去消费,花了2千元,然后他的妻子去查看他今天的消费记录(全表扫描FTS,妻子事务开启),看到确实是花了2千元,就在这个时候,程序员花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。当妻子打印程序员的消费记录清单时(妻子事务提交),发现花了1.2万元,似乎出现了幻觉,这就是幻读。

特别申明:mysql中默认的隔离级别是Repeatable read可重复读,但是内部通过间隙锁机制巧妙的解决了幻读的问题,这里就不一一展开了

三.补充知识

mysql默认情况下auto_commit属性未true

当执行sql时,会隐式提交一个事务,并自动提交

1.更改auto_commit属性未false

2.输入以下命令手动提交一个事务

begin;

select * from student;

commit;

四.实现原理

1.Read uncommitted读未提交

不需要MVCC

2.Read committed读提交

多版本并发控制实现,即多版本链,也可以称为redolog

3.Repeatable read可重复读

多版本并发控制解决读未提交、不可重复读

读锁+写锁(包括间隙锁)解决幻读

mysql 事务 返回插入的值_深入理解mysql事务:事务机制的实现原理相关推荐

  1. mysql 事务 返回插入的值_Mysql同一个事务内记录成功插入后查询不出来

    背景: 1)mysql:Ver 14.12 Distrib 5.0.45, for Win32 (ia32) 2)mysql odbc驱动:3.51.22 3)vs2005 4)客户端用ado,odb ...

  2. mysql存储过程返回多个值_数据库mysql存储过程之返回多个值的方法示例

    本文实例讲述了mysql存储过程之返回多个值的方法.分享给大家供大家参考,具体如下: mysql存储函数只返回一个值.要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程.咱们先来 ...

  3. java函数返回多个值_深入理解被调函数与主调函数之间的传值、传址、值返回、址返回...

    函数的英文是function,有功能的意思,函数的作用在于合理分配功能,增强程序的可读性.合理分解功能,降低程序的复杂性.隐藏函数内部的数据和实现,尽可能将问题局限于函数本身. 函数可以理解为一种功能 ...

  4. mysql中的宽字符注入_深入理解Mysql宽字符注入

    之前记录过一篇 写的不够详细 概念 宽字节是相对于ascII这样单字节而言的:像GB2312.GBK.GB18030.BIG5.Shift_JIS等这些都是常说的宽字节,实际上只有两字节 GBK是一种 ...

  5. 《MySQL是怎样运行的:从根儿上理解MySQL》- mysql 数据存储

    <MySQL是怎样运行的:从根儿上理解MySQL>- mysql 数据存储 <MySQL是怎样运行的:从根儿上理解MySQL>读书笔记 InnoDb数据页结构 页是 InnoD ...

  6. MySQL必知必会教程:深入理解MySQL技术内幕

    2019独角兽企业重金招聘Python工程师标准>>> MySQL必知必会教程:深入理解MySQL技术内幕 作为最流行的开源数据库软件之一,MySQL数据库软件已经是广为人知了.当前 ...

  7. mysql两个空值相同吗_你知道mysql中空值和null值的区别吗

    前言 最近发现带的小伙伴写sql对于空值的判断方法不正确,导致程序里面的数据产生错误,在此进行一下整理,方便大家以后正确的判断空值.以下带来示例给大家进行讲解. 建表 create table tes ...

  8. mysql更改表 值_如何更改MySQL表中行实例的值?

    UPDATE命令以及WHERE子句可用于更改行实例的值.基本上,MySQL将根据查询中给出的条件更改值.下面的例子可以证明它 假设我们想在下面给出的"测试"表中将名称从" ...

  9. r 函数返回多个值_第四讲 R描述性统计分析

    在"R与生物统计专题"中,我们会从介绍R的基本知识展开到生物统计原理及其在R中的实现.以从浅入深,层层递进的形式在投必得医学公众号更新. 在上一讲中,我们介绍了第三讲 R编程基础- ...

最新文章

  1. Win32汇编最简ComboBox Demo
  2. Database之SQLSever:SQL命令实现四则运算、desc降序、like模糊查询、distinct去重、MAX/MIN/SUM/AVG/COUNT/GROUP/having等案例之详细攻略
  3. hdu 2544 dijkstra
  4. 【2010福建】收稻子 (校BSOJ1114)
  5. python find()效率_基于python分别采用同步与异步(协程)方式抓取时光网TOP100电影...
  6. Docker 容器的运行(八)
  7. 持续集成Jenkins
  8. Redis:四、jedis连接redis服务器
  9. 用户使用情况报告(附用户使用调查表)
  10. 如何一站式高效管理固定资产?
  11. 极差标准差方差简单计算
  12. js中Array对象。concat,concat,pop,push,reserve,shift,slice,splice,toString,toLocaleString,unshift
  13. 2020.10.13--PS--像素化滤镜、扭曲类滤镜、波浪和水波
  14. abaqus钢结构螺栓连接分析
  15. mysql唯一索引什么意思_MySQL唯一索引什么意思
  16. 程序员多数性功能不行_1024,节日快乐!南京程序员绝不认输
  17. php导航收录源码,PHP最新响应式自动收录自带查反链导航源码
  18. 计算机与现代教育的英语作文,雅思写作高分范文:电脑是否现代教育所必须?...
  19. 永辉超市业绩下滑背后:新零售遇融合难题?
  20. 教你如何用拼音输入法怎么打出来不认识的字

热门文章

  1. 有关Silverlight TabControl组件的研究——Silverlight学习笔记(5)
  2. 习题1.29 (积分方法的优化---simpson规则)
  3. 向服务器写入错误日志-log
  4. 修改Win7远程桌面端口
  5. ECSHOP中添加自定义lbi文件
  6. Devexpress 常见问题
  7. duilib CTileLayoutUI 控件
  8. 分表扩展全局序列原理_高可用_单表存储千万级_海量存储_分表扩展---MyCat分布式数据库集群架构工作笔记0025
  9. Netty工作笔记0022---NIO快速入门--编写客户端
  10. Penn Treebank词性标记集