数据库事务的隔离机制

数据库事务(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)是以测试作为开发过程的中心,它坚持,在编写实际代码之前,先写好基于产品代码的测试代码。开发过程的目标就是首先使测试能够通过,然后再优化设计结构…

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

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

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

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

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

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

popoverController(iPad)

一、设置尺寸 提示&#xff1a;不建议&#xff0c;像下面这样吧popover的宽度和高度写死。 1 //1.新建一个内容控制器2 YYMenuViewController *menuVc[[YYMenuViewController alloc]init];3 4 //2.新建一个popoverController&#xff0c;并设置其内容控制器5 s…

fastQC

Fastqc用途 FastQC aims to provide a simple way to do some quality control checks on raw sequence data coming from high throughput sequencing pipelines. It provides a modular set of analyses which you can use to give a quick impression of whether your data …

C++ Handle(句柄) part1

本文是我学习C&#xff0b;&#xff0b;沉思录第6章的笔记 本文主要讲述了Handle类的概念&#xff0c;定义方法以及写时复制技术。 在前文(Surrogate代理类)的讲解中我们了解到了代理的实现方法. 代理类有很多好处,但是麻烦的是每次都得进行复制.如果该类是经常使用并且member很…

Swift调用Objective C的FrameWork

很多Github的库经过很多年的发展&#xff0c;源码都是OC写的&#xff0c;&#xff0c;所以&#xff0c;用Swift调用OC的库就是开发中难免遇到的的一个问题&#xff0c;本文以AFNetworking为例&#xff0c;讲解如何跨语言调用。 第一步 创建一个空的工程 注意&#xff0c;语言选…

显式(静态)调用: LIB + DLL + .H

1、编程时用ad.h,ad.lib,放在项目当前目录里2、在头文件中加入#include "ad.h"3、在Project Setting–>Link–>Object/library modules加入ad.lib执行时将ad.dll跟你的程序放在同一目录。 就可以直接调用dll中的函数了 当前目录 转载于:https://www.cnblogs.co…

接入支付宝出现交易订单处理失败,请稍后再试(ALI64)的错误

上次在接入支付宝的时候就碰到了交易订单处理失败&#xff0c;请稍后再试&#xff08;ALI64&#xff09;这样的错误&#xff0c;后来经过排查和总结&#xff0c;一般来讲这种问题都是公钥和私钥没有正确配置造成的。支付宝这边为了保证数据在传输时不被篡改&#xff0c;使用了r…

支付宝集成交互流程

交互流程 功能流程 流程说明&#xff08;以Android平台为例&#xff09;&#xff1a; 第4步&#xff1a;调用支付接口&#xff1a;此消息就是本接口所描述的开发包提供的支付对象PayTask&#xff0c;将商户签名后的订单信息传进pay方法唤起支付宝收银台&#xff0c;订单格式具体…

VxLAN基础

转自&#xff1a;http://blog.csdn.net/freezgw1985/article/details/16354897 一 . 为什么需要Vxlan1. vlan的数量限制4096个vlan远不能满足大规模云计算数据中心的需求2. 物理网络基础设施的限制基于IP子网的区域划分限制了需要二层网络连通性的应用负载的部署3. TOR交换机MA…

C语言程序代码优化

我认为一个好的用于科学计算的程序代码应该&#xff1a;算法漂亮精妙&#xff0c;程序简洁易懂&#xff0c;运算快速&#xff0c;节省内存。这里有的地方是矛盾的&#xff0c;比如简洁vs易懂&#xff0c;时间vs空间&#xff0c;找个平衡吧。目前来看时间要比空间宝贵一些。写程…

如何在苹果官网下载旧版本的Xcode 方法

1 在百度里输入“苹果开发者中心“&#xff0c;进入以下页面。点击页面中的“Member Center" 2 出现登录界面。这是需要苹果开发者帐号的&#xff0c;没有帐号的可以选择“Create Apple ID”进行注册。已经注册的选择“Sign In"登录 3 页面跳转后&#xff0c;选择…

【转】android多分辨率适配

前一阶段开发android项目&#xff0c;由于客户要求进行多分辨率适配&#xff0c;能够支持国内主流的分辨率手机。因此经过了几次开发走了很多弯路&#xff0c;目前刚刚领略了android多分辨率适配的一些方法。 先介绍一下所走的弯路&#xff0c;由于android的布局文件存放在res的…

Java线程池介绍

根据摩尔定律&#xff08;Moore’s law&#xff09;&#xff0c;集成电路晶体管的数量差不多每两年就会翻一倍。但是晶体管数量指数级的增长不一定会导致 CPU 性能的指数级增长。处理器制造商花了很多年来提高时钟频率和指令并行。在新一代的处理器上&#xff0c;单线程程序的执…

cocoa pods的安装与我遇到的问题

1.打开终端 终端输入 ruby -v 查看ruby的版本 打印代码&#xff1a; ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15] 2. 更换ruby镜像 终端输入如下命令&#xff08;把Ruby镜像指向taobao&#xff0c;避免被墙&#xff0c;你懂得&#xff09; a.移…

Implicit declaration of function 'NSFileTypeForHFSTypeCode' is invalid in C99

一般出现该问题是因为通过C调用了unix/linux 底层接口&#xff0c;所以需要调整c语言的编译选项&#xff0c;设置方法见下图&#xff1a;(根据实际情况选择相应的编译选项)