在写之前交代一下背景吧!

做开发也好久了,没怎么整理过知识,现在剖析一下自己对数据库事务的认识,以前用sqlserver,现在转java后又用mysql、oracle。我这块就主要解释一下mysql数据库事务。其实好多内容适用于各种标准数据库!

直接就进入正文了!

不管是做啥都有理论知识,我在这块也介绍一下。

  • 事务的特性

1.原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

2.一致性(Consistency):在一个事务中,事务前后数据的完整性必须保持一致,可以想象银行转账、火车购票。

3.隔离性(Isolation):多个事务,事务的隔离性是指多个用户并发访问数据库时, 一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。

4.持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

写这些概念呢,是有点绕!绕就绕吧!反正也不是我规定的,这是官方的,解释是我编的!!!

  •  事务的并发访问问题


如果我们在不考虑隔离性问题时,事务是存在三种并发访问问题的。

1.脏读:在一个事务中,当读取数据时,读到了另一个事务未提交的数据。

比如A账户给B账户转了1块钱,但是A没有提交事务,被B账户通过脏读看到了,这时,B就会以为A已经把钱转过来了,但是这时,A账户回滚事务。其实钱就没给B转过去,但是B自己本身以为A已经转过去了,,,有点绕,估计是我描述到绕!

看代码:

update account set money=money+1 where name=’B’;   --此时A去通知B

update account set money=money -1 where name=’A’;

  

2.不可重复读:在一个事务中,两次读取的数据内容不一致,这是因为在查询时,有时间间隔,数据被另一个事务已经修改提交了,那就会出现问题。

3.幻读/虚读:在一个事务中,两次读取的数据量不一致。

  • 事务的隔离级别

上面介绍了3种事务并发问题!现在介绍一下数据库提供的解决方案!

1.read uncommitted : 读取尚未提交的数据 :这个最低级,但是效率肯定最高,但是哪一个问题都不能解决。

2.read committed:读取已经提交的数据 :可以解决脏读  。

3.repeatable read:重读读取:可以解决脏读 和 不可重复读 。

4.serializable:串行化:可以解决脏读不可重复读和虚读,效率最差,相当于锁表,开发中一般不用。

上面的“2”是oracle数据库默认设置,“3”是mysql数据库默认的设置。

下面呢我就重点解释一下mysql数据库在上面各种事务隔离级别上的演示:

首先介绍两个语法:

1.查看mysql数据库默认的隔离级别:select @@tx_isolation

如图:

2.设置mysql的隔离级别:set session transaction isolation level 事务的隔离级别

如图:

  • 事务的隔离级别演示

注意:如果要自己模拟要开启两个mysql客户端,也就是模拟两个用户!

1.read uncommitted

如图:

我通过语法将数据库的事务隔离级别改为了read uncommitted。

首先我有一张account表。

如图:窗口一

窗口二

数据库表原始数据money都是5000,当我启动事务后,在zhangsan账户增加了1000和在李四账户减去了1000,但是我的事务还未提交,但是我再次查询数据库表时,数据已经发生变化,这就是脏读和不可重复读

幻读/虚读我就不掩饰了,同样存在!

2.read committed

如图:

我将数据库事务隔离性改为了read committted。

还是上面那张表:

如图:窗口一

窗口二

数据库表zhangsan账户的money和lisi账户的money都发生了变化,我未提交事务,在另一个窗口事务开启下查询时,没有出现脏读,但是当我提交事务时,在另一个窗口的事务下再次查询,出现了不可重复读的情况,这样可以避免脏读,但是查询时已经出现不可重复读和幻读/虚读!

3.repeatable read

如图:

我将数据库事务隔离性改为了read committted。

还是上面那张表:

如图:窗口一

窗口二

我在两个窗口都开启了事务,当窗口一进行数据操作后,并进行事务提交,在窗口二的事务开启情况下,我去查询,没有查询到刚才窗口一的数据操作记录,这样就避免了脏读和不可重复读

有人说也避免了虚读/幻读,其实没有。

看图:

我在操作lisi账户时,数据只是发生修改的变化,但是当我修改wangwu这个账户时,再去查询出现了wangwu,账户的数据,但是其实在我未操作前,wangwu账户的数据是查询不出的。这就是幻读/虚读!


如果不理解幻读/虚读这块,可以查一下InnoDB

4.serializable

我就不演示了,开发不建议用,效率又慢,但是所有的问题都能避免!!

总结一下 

事务隔离级别的性能:

read uncommitted>read committed>repeatable read>serialazable

事务隔离级别的安全性:

read uncommitted<read committed<repeatable read<serialazable

mysql 事务控制:

开启事务:start transaction;

提交:commit;

回滚:rollback;

mysql数据库事务详细剖析的更多相关文章

  1. MySQL数据库事务剖析

    MySQL数据库事务剖析 事务就是一组原子性的SQL查询,是一个独立的执行单元.事务内的语句,要么全部执行成功,要么全部执行失败. 1.事务的标准特征 一个运行良好的事务处理系统,必须具备原子性.一致 ...

  2. Mysql数据库事务隔离级别

    事务(transaction)是数据库管理系统的执行单位,可以是一个数据库操作(如Select操作)或者是一组操作序列.事务ACID属性,即原子性(Atomicity).一致性(Consistency ...

  3. MySql数据库事务正常提交,回滚失败

    问题:在初次练习Mysql数据库事务时,事务正常提交,但是在遇到异常应当回滚时,回滚失败. 代码如下: //2.更新操作. public void update(Connection conn, St ...

  4. Mysql数据库事务的隔离级别和锁的实现原理分析

    Mysql数据库事务的隔离级别和锁的实现原理分析 找到大神了:http://blog.csdn.net/tangkund3218/article/details/51753243 InnoDB使用MV ...

  5. MySQL数据库详解(三)MySQL的事务隔离剖析

    提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务.最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱. 转账过程具体到程序里会有一系列的操作,比如 ...

  6. MySQL 数据库事务与复制

    好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适. 最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类. 结合实际工作中碰到的问题,以寻找答案的方式 ...

  7. 后端分布式系列:分布式存储-MySQL 数据库事务与复制

    好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适.最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类.结合实际工作中碰到的问题,以寻找答案的方式来剖 ...

  8. MySQL数据库事务各隔离级别加锁情况--read committed && MVCC(转载)

    http://www.imooc.com/article/17290 http://www.51testing.com/html/38/n-3720638.html https://dev.mysql ...

  9. MySQL数据库事务各隔离级别加锁情况--read committed && MVCC(转)

    本文转自https://m.imooc.com/article/details?article_id=17290 感谢作者 上篇记录了我对MySQL 事务 隔离级别read uncommitted的理 ...

随机推荐

  1. Python自学笔记-字符串编码(来自廖雪峰的官网Python3)

    感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看.   1.理解变 ...

  2. ch5-Class 与 Style 绑定(v-bind:class v-bind:style)

    数据绑定一个常见需求是操作元素的 class 列表和它的内联样式. 因为它们都是属性 ,我们可以用v-bind 处理它们:只需要计算出表达式最终的字符串. 不过,字符串拼接麻烦又易错.因此,在 v-b ...

  3. 【转】Python实现修改Windows CMD命令行输出颜色(完全解析)

    用Python写命令行程序的时候,单一的输出颜色太单调.其实我们可以加些色彩,比如用红色表示警告,绿色表示结果正常等.网上也有几篇类似的帖子,但是没有把问题讲清楚,贴的代码也不是太清晰.这里,对Win ...

  4. Asp.Net MVC4 系列--进阶篇之路由 (2)

    上一篇介绍了Asp.Net MVC 中,从Http Pipeline上接收到请求如何匹配,匹配限制,以及如何控制在指定命名空间查找,解析出controller和action,并传参. 这篇主要介绍如何 ...

  5. DevOps之网络

    唠叨话 关于德语噢屁事的知识点,仅提供专业性的精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. <网络(Network)> 关于网络的网络架构和网络模型:知识与技能的层次(知道. ...

  6. ctp交易平台转java接口转换

    首先感谢倪材@csdn的博客,给了我很大帮助. http://blog.csdn.net/pjjing/article/details/53186394 http://blog.csdn.net/pj ...

  7. 【学习】js学习笔记---字符串对象

    一.属性 1.length 字符串的长度,且不区分中英文的字节. 示例代码: var str="abcdefghijklmn"; var str1="中文汉语" ...

  8. Java 多态、内部类、异常、包

    一.多态 1. 概述 理解:多态可以理解为事物存在的多种体(表)现形态. 例如: 动物中的猫和狗. 猫这个对象对应的是猫类型,例如:猫 x = new 猫(); 同时猫也是动物中的一种,也可以把猫称为 ...

  9. 深入浅出 SpringMVC - 1

    前言: 本篇笔记是LZ在之前学习 SpringMVC 框架时所的记录,分两篇分享,此篇为基础篇,包括 SpringMVC 环境在 Eclipse 中的搭建,SpringMVC 的 HelloWorld ...

  10. linux 内核 zImage 生成过程分析

    1. 依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩,带调试信息.符号表的最初的内核,大小约23MB: arm ...