数据库事务的隔离机制

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。----百度百科
就是说你定义一组数据库操作,然后告诉数据库说这些操作要么都成功,要么都不成功。
类似于网购买东西:你付完款,商家必须把东西寄到你的手上,期间无论是库存、快递、快递员、商品质量等任何一个环节出问题,商家必须把钱退回给你。那么买东西,就是一个事务。
事务的特性有四种--ACID:
  • 原子性(Atomic):这个强调事务的根本特性,一个事务内的所有操作必须像原子操作一样,要么都成功要么都失败,不能再拆分了。
  • 一致性(Consistent):这个强调数据的完整性。就是说事务修改前后,数据符合逻辑上的完整性。就像包裹从仓库寄到你家,手机不能变成砖头。
  • 隔离性(Insulation):这个强调的是两个并发的事务应该是互不干扰的。虽然两个包裹都是从北京寄到上海,但是A包裹被退回时,买家和卖家都没必要去管B包裹是啥情况。
  • 持久性(Duration):这个强调事务完成后对数据库的影响是永久的,进入一个稳定的状态。这个是相对于事务的实现来说的,数据库为了维持一个事务,需要做很多缓存或者临时性的操作。持久性就是在事务结束后,这些临时操作都正式生效了。比如你手机确认收货后,买手机的过程就正式完成了。对于卖家来说,再有别的问题,那就是售后的问题,而不是销售的问题了。
相信读者在看到事务的隔离性时,就会有疑问:两个并发的事务不能同时修改同一条数据,那同时读一条数据时怎么办呢?
这就会涉及数据库对事务的隔离控制:很明显,不能让两个并发的事务同时修改同一条数据,但是照顾到性能,也不能不让两个事务同时读同一条数据吧?“查询”这么无公害的操作,何必要赶尽杀绝呢?

先看看,如果两个事务同时操作同一条数据,会带来哪些问题:
1.丢失更新:当前余额为:1,A事务的功能是把余额+1;B事务的功能是把余额-1;它俩同时读到了余额为0,悲剧就发生了。。。。
2.脏读:A事务正在把userName改成‘bizi’,还没有提交,B事务来读取userName,得到了‘bizi’,但是A事务在修改age时抛了异常,因此回滚,结果B事务就悲剧了。。。。
3.幻读:A事务读了一下当前的订单数目,B事务过来新增加了一个订单,A事务又读了一次订单数,读了两次竟然结果不一样,闹鬼了。。。 
4.不可重复读:A事务读取了某条数据,B事务过来修改了这条数据并提交,A事务再读的时候,就发现跟刚刚不一样哎。。。
不可重复读跟脏读的区别
    脏读读取的是未提交的数据,很有可能是无效的数据。而不可重复读读取的是提交之后的数据,最起码第二次读对了
不可重复读跟幻读的区别
    幻读读的是一整条记录,而不可重复读针对的是某一个或几个特定字段。

那么为了避免这种情况,数据库就设定了几种隔离级别,供我们使用:
1.串行化(Serializable):不允许事务并发,大家排好队,上一个事务提交(或回滚)了,下一个事务再执行。
2.可重复读(Repeatable-Read):同一事务前后两次的读,保证数据一致。意思就是:读的时候,不允许别人写。但是允许别人插入别的数据,因此不能避免幻读。
3.读已提交(Read Commited):只允许事务读取被其他事务提交的数据。意思就是:如果当前事务是修改数据,那么不允许读。因此避免脏读,但是不能避免幻读和不可重复读。
4.读未提交(Read Uncommitted):允许事务读取其他事务还未提交的数据。因此上述问题都会发生。
一个表格可以说明一切(来源于@jiajialin:http://blog.csdn.net/jialinqiang/article/details/8723044):
814744-20151104165911196-1155619368.png

814744-20151104165912680-2127827621.png


来自为知笔记(Wiz)


转载于:https://www.cnblogs.com/bishion/p/4936523.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用CppUnit进行单元测试

http://www.vckbase.com/document/viewdoc/?id1762 一、前言 测试驱动开发(TDD)是以测试作为开发过程的中心,它坚持,在编写实际代码之前,先写好基于产品代码的测试代码。开发过程的目标就是首先使测试能够通过,然后再优化设计结构…

录制wav格式的音频

项目中有面部认证、声纹认证&#xff0c;服务器端要求上传wav格式的音频&#xff0c;所以写了这样一个小demo。 刚刚开始写博客还不知道怎么上传代码&#xff0c;就复制了&#xff0c;嘻嘻 DotimeManage.h class DotimeManage; protocol DotimeManageDelegate <NSObject&g…

iOS开发网络篇—Reachability检测网络状态

前言&#xff1a;当应用程序需要访问网络的时候&#xff0c;它首先应该检查设备的网络状态&#xff0c;确认设备的网络环境及连接情况&#xff0c;并针对这些情况提醒用户做出相应的处理。最好能监听设备的网络状态的改变&#xff0c;当设备网络状态连接、断开时&#xff0c;程…

网络七层协议 五层模型 TCP连接 HTTP连接 socket套接字

socket&#xff08;套接字&#xff09;是通信的基石&#xff0c;是支持TCP/IP协议的网络通信的基本操作单元&#xff0c;包含进行网络通信必须的五种信息&#xff1a;连接使用的协议&#xff0c;本地主机的IP地址&#xff0c;本地进程的协议端口&#xff0c;远地主机的IP地址&a…

[vs2010 project] CppUnit快速入门

简介 测试是软件开发过程中极其重要的一环&#xff0c;详尽周密的测试能够减少软件BUG&#xff0c;提高软件品质。测试包括单元测试、系统测试等。其中单元测试是指针对软件功能单元所作的测试&#xff0c;这里的功能单元可以是一个类的属性或者方法&#xff0c;测试的目的是看…

[javascript|基本概念|Number]学习笔记

Number类型的值&#xff1a;整数/浮点数值 整数 十进制 e.g.: var intNum 50; 八进制 (严格模式下无效,解析错误)字面值首位必须是0,之后的数字序列为0&#xff5e;7 e.g.: var intNum 070; //解析为十进制56 (如果字面值数值超出了范围&#xff0c;前导0将被忽略&#xf…

[转]深入理解linux内核list_head

http://blog.chinaunix.net/uid-27122224-id-3277511.html 深入理解linux内核list_head的实现 2012-07-17 17:37:01 分类&#xff1a; LINUX 前言&#xff1a;在linux源代码中有个头文件为list.h。很多linux下的源代码都会使用这个头文件&#xff0c;它里面定义 了一个结构,以及…

xcode左侧不显示工程文件目录,提示NO Filter Results

解决办法&#xff1a; What solved was to go to Navigate > Reveal in Project Navigator . After this, the structure appeared again.

【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信

在工控测试系统中&#xff0c;经常需要使用到各类程控仪器&#xff0c;这些程控仪器通常具有GPIB、LAN、USB等硬件接口&#xff0c;计算机通过这些接口能够与其通信&#xff0c;从而实现自动测量、数据采集、数据分析和数据处理等操作。本文主要介绍如何与程控仪器通过GPIB接口…

标题在上边框中的html(fieldset标签)

<fieldset> <legend>标题</legend> 内容 </fieldset> 转载于:https://www.cnblogs.com/lswbk/p/4952820.html

移除项目中的CocoaPods

在项目中移除CocoaPods cocoaPods虽然很方便&#xff0c;但是我是真心的不喜欢用它&#xff0c;总是出错如果你觉得CocoaPods让你的项目出现了问题&#xff0c;不好用甚至是恶心&#xff0c;想将其从项目中彻底移除&#xff0c;也有方法&#xff1a; 1.删除工程文件夹下的Podf…

ShellExecute使用详解

有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂&#xff0c;比较少用。 2.WinExec主要运行EXE文件。如&#xff1a;WinExec(Notepad.exe Readme.txt, SW_SHOW); 3.ShellExecute不仅可以运行EXE文件&#xff0c;也可以运行…

javascript笔记整理(对象基础)

一、名词解释 1.基于对象&#xff08;一切皆对象&#xff0c;以对象的概念来编程&#xff09; 2.面向对象编程(Object Oriented Programming&#xff0c;OOP) A.对象(JavaScript 中的所有事物都是对象) B.对象的属性和行为 属性:用数据值来描述他的状态 行为:用来改变对象行为的…

java的安装和配置

JRE (JAVA Runtime Enviroment java运行环境),包括JVM(java虚拟机)和java程序所需的核心功能类库&#xff0c;如果只是运行java程序&#xff0c;只需安装JRE。 JDK &#xff08;Java Development Kit 开发工具包&#xff09;包括开发JAVA程序时所需的工具&#xff0c;包括JRE…

#if, #ifdef, #ifndef, #else, #elif, #endif的用法

#ifdef的用法 灵活使用#ifdef指示符&#xff0c;我们可以区隔一些与特定头文件、程序库和其他文件版本有关的代码。 代码举例&#xff1a;新建define.cpp文件 &#xff03;include "iostream.h" int main() { #ifdef DEBUG cout<< "Beginning ex…

redhat 6.6 安装 (LVM)

http://www.cnblogs.com/kerrycode/p/4341960.html转载于:https://www.cnblogs.com/zengkefu/p/4954955.html

MFC对话框最小化到托盘

1、在资源中的Icon中导入一个自己喜欢的图标&#xff0c;ID命名为IDR_MAINFRAME&#xff0c;将先前的IDR_MAINFRAME的图标删除掉&#xff1b; 2、在自己的Dialog头文件中定义一个变量 NOTIFYICONDATA m_nid&#xff0c;关于该结构体的具体信息可以查阅MSDN&#xff1b; 3、添加…

Android acache读后感

今天了解到了一个android轻量级的开源缓存框架,(github&#xff1a;https://github.com/yangfuhai/ASimpleCache),花了一点时间研究了一下源代码&#xff0c;大概的思路就是每个缓存目录对应一个Acache类&#xff0c;通过mInstanceMap关联&#xff08;个人觉得这个主要是减少对…

continue break

块作用域 一个块或复合语句是用一对花括号&#xff08;"{}"&#xff09;括起来的任意数量的简单的java语句。块定义了变量的作用范围。 1、嵌套块是方法内的嵌套&#xff0c;不包括类的花括号。在嵌套块内的 变量是不可以重复定义的。 2、不允许重复定义的是局部变…

GetVersionEx 获取系统版本信息

转自&#xff1a;http://blog.csdn.net/yyingwei/article/details/8286658 最近在windows 8上获取系统版本信息需要调用系统API&#xff0c;于是用到了GetVersionEx。 首先看一看函数原型&#xff1a; [cpp] view plaincopy BOOL GetVersionEx(POSVERSIONINFO pVersionInformat…