事务的四大特性和隔离级别

1.事务的四大特性(ACID):指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。

1.1 原子性(Atomicity)

第一个原子性,这个是最简单的。说的是一个事物内所有操作共同组成一个原子包,要么全部成功,要么全部失败。这是最基本的特性,保证了因为一些其他因素导致数据库异常,或者宕机。

1.2 一致性(Consistency)

第二一致性,这个是大家误解最深的,很多博客都喜欢用银行转账的例子来讲一直性,所谓的一致性是基于原子性。

原子性只保证了一个事物内的所有操作同一性,大家同生死,不会出现你死了,我还活着。但是,原子性并没有保证大家同一时刻一起生,一起死。计算机指令是有先后顺序的,这样就决定了一个事物的提交,会经历一个时间过程,那么如果事物提交进行到了一半,我读取了数据库,会不会读到中间结果?

为了防止这样的情况,数据库事物的一致性就规定了事物提交前后,永远只可能存在事物提交前的状态和事物提交后的状态,从一个一致性的状态到另一个一致性状态,而不可能出现中间的过程态。也就是说事物的执行结果是量子化状态,而不是线性状态。

数据库提交事物会有一个过程,如果提交的时候,存在一个时间差,在提交的第一秒,一个删除过程还没完成到了第三秒才完成,会不会第一秒访问的人和第三秒访问的人得到不同的结果?出现不一致,状态的混沌?这就是一致性得保证的只会有前状态和后状态,绝不会出现中间态。

1.3 隔离性(Isolation)

事物的隔离性,基于原子性和一致性,因为事物是原子化,量子化的,所以,事物可以有多个原子包的形式并发执行,但是,每个事物互不干扰。

但是,由于多个事物可能操作同一个资源,不同的事物为了保证隔离性,会有很多锁方案,当然这是数据库的实现,他们怎么实现的,我们不必深究。

1.4持久性(Durability)

持久性,当一个事物提交之后,数据库状态永远的发生了改变,这个事物只要提交了,哪怕提交后宕机,他也确确实实的提交了,不会出现因为

刚刚宕机了而让提交不生效,是要事物提交,他就像洗不掉的纹身,永远的固化了,除非你毁了硬盘。

2.不考虑隔离性可能产生的问题

 

现在重点说明下事务的隔离性,当多个线程(或多个客户端)都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性。

 

如果不考虑事务的隔离性,会发生的几种问题:

 

2.1 脏读

 

脏读是指在一个事务处理过程中读取了另一个未提交的事务中的数据。

 

2.2 不可重复读

 

不可重复读是指对于数据库中的某个数据,一个事务内多次查询却返回了不同的数据值,这是由于在事务执行过程中,数据被另一个事务修改并提交了。

 

2.3 幻读

 

幻读是事务非独立执行时发生的一种现象。例如,事务T1对一个表中所有的行的某个字段做了从“1”修改为“2”的操作,这时事务T2又插入了一条新的记录,而该字段的值为“1”并且提交给数据库。这时,操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是产生了幻读。

 

幻读和不可重复读都是读取了另一条已经提交的事务,所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据(比如数据的个数)。

 

3.事务的隔离级别

3.1 read uncommitted : 读取尚未提交的数据 :哪个问题都不能解决

3.2 read committed:读取已经提交的数据 :可以解决脏读 ---- oracle、sql server、postgresql 默认的

3.3 repeatable read:重读读取:可以解决脏读 和 不可重复读 ---mysql默认的

3.4 serializable:串行化:可以解决 脏读 不可重复读 和 虚读---相当于锁表

以上四种隔离级别最高的是Serializable,最低的是Read uncommitted级别。当然,隔离级别越高,执行效率就越低。

 

01:Mysql的默认隔离级别是:可重复读:Repeatable read;

02:oracle数据库中,只支持seralizable(串行化)级别和Read committed();默认的是Read committed级别;

下面就四种隔离级别进行场景设计:

01: Read uncommitted 读未提交; 公司发工资了,领导把5000元打到singo的账号上,但是该事务并未提交,而singo正好去查看账户,发现工资已经到账,是5000元整,非常高兴。可是不幸的是,领导发现发给singo的工资金额不对,是2000元,于是迅速回滚了事务,修改金额后,将事务提交,最后singo实际的工资只有2000元,singo空欢喜一场。

02:Read committed 读已提交; singo拿着工资卡去消费,系统读取到卡里确实有2000元,而此时她的老婆也正好在网上转账,把singo工资卡的2000元转到另一账户,并在singo之前提交了事务,当singo扣款时,系统检查到singo的工资卡已经没有钱,扣款失败,singo十分纳闷,明明卡里有钱,为何......

03:Repeatable read 重复读 当singo拿着工资卡去消费时,一旦系统开始读取工资卡信息(即事务开始),singo的老婆就不可能对该记录进行修改,也就是singo的老婆不能在此时转账。

04:重复读可能出现幻读: singo的老婆工作在银行部门,她时常通过银行内部系统查看singo的信用卡消费记录。有一天,她正在查询到singo当月信用卡的总消费金额(select sum(amount) from transaction where month = 本月)为80元,而singo此时正好在外面胡吃海塞后在收银台买单,消费1000元,即新增了一条1000元的消费记录(insert transaction ... ),并提交了事务,随后singo的老婆将singo当月信用卡消费的明细打印到A4纸上,却发现消费总额为1080元,singo的老婆很诧异,以为出现了幻觉,幻读就这样产生了。

Serializabale:最高的事务隔离级别,代价花费最高,性能很低,很少使用,在此级别下,事务顺序执行,避免上述产生的情况。

转载于:https://www.cnblogs.com/codebj/p/11031813.html

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

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

相关文章

改造MUC实现Openfire群

我的Openfire群实现思路: 1、群和群成员,要保存到表中。 2、拉取群列表和群成员列表,均从DB中查询返回。 3、抛弃老外的“进房间,要发Presence ”。只要此人一上线,就模似一个Presence进行joinRoom,进入他的…

如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信

http://blog.csdn.net/whuancai/article/details/11994341 如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 原文出自:http://blog.csdn.net/monkey_d_meng/article/details/5894910 尊重作者:MONKEY_D_MENG 最近一段时间,由…

14 Scroll 滚动搜索

Scroll的用法:第一次搜的时候,要指定 快照保留时间1min,分页的大小:2条/页;对于第一次搜索,ES会返回一个这个scroll的id;下次再搜的时候,就带着这个scrollid去搜就行了,不…

解决IE6透明PNG图片的代码

使用方法1.下载DD_belatedPNG.js文件&#xff08;官方网站&#xff1a;http://www.dillerdesign.com/experiment/DD_belatedPNG/&#xff09;. 2.在网页中head区引用,如下:<!--[if IE 6]><script src"DD_belatedPNG.js" mce_src"DD_belatedPNG.js"…

LVS+Keepalived负载均衡方式总结

1、负载均衡器、服务器集群直连方式&#xff08;lb_kind DR&#xff09;http://network.51cto.com/art/201006/206831.htmhttp://www.myhack58.com/Article/sort099/sort0102/2012/35640_4.htm负载均衡器最简洁安装可以直接#yum ipvsadm keepalived根据51cto.com网站知道要分别…

VS2008中使用JSONCPP方法小结

http://sourceforge.net/projects/jsoncpp/?sourcetyp_redirect C要使用JSON来解析数据&#xff0c;一般采用jsoncpp. 下载jsoncpp后&#xff0c;按ReadMe文档的说法是要先安装的&#xff0c;但是安装比较麻烦。然而事实上&#xff0c;我们并不需要安装&#xff0c;就可以直接…

SQL条件语句(IF, CASE WHEN, IF NULL)

1.IF 表达式&#xff1a;IF( expr1 , expr2 , expr3 ) expr1条件&#xff0c;条件为true&#xff0c;则值是expr2 &#xff0c;false&#xff0c;值就是expr3 SELECT o.id,u.account,catagory.name,orderTime,detail.amount,periodtime,if(direction0,看涨,看跌) directionNam…

Forensic Challenge 9 - Mobile Malware

使用智能手机的人越来越多&#xff0c;对智能手机的安全研究也慢慢开始成为重点。The honey project有一个Mobile malware的挑战赛&#xff0c; 带你走进Mobile Malwares的世界。参见&#xff1a; Forensic Challenge 9 - "Mobile Malware" 样本&#xff1a; fc9fil…

如何在Windows下编译OpenSSL

OpenSSL是一个开源的第三方库&#xff0c;它实现了SSL&#xff08;Secure SocketLayer&#xff09;和TLS&#xff08;Transport Layer Security&#xff09;协议&#xff0c;被广泛企业应用所采用。对于一般的开发人员而言&#xff0c;在 http://slproweb.com/products/Win32Op…

《团队名称》第八次团队作业:Alpha冲刺day5

项目内容这个作业属于哪个课程2016计算机科学与工程学院软件工程(西北师范大学)这个作业的要求在哪里实验十二 团队作业8—软件测试与ALPHA冲刺团队名称快活帮作业学习目标 &#xff08;1&#xff09;掌握软件测试基础技术。 &#xff08;2&#xff09;学习迭代式增量软件开发过…

(转)C# 把我所积累的类库全部分享给博友(附件已经上传)

http://files.cnblogs.com/LsGW/Common.zip转载于:https://www.cnblogs.com/meetrice/archive/2012/01/02/2310428.html

Oracle的resetlogs机制浅析

alter database open resetlogs 这个命令我想大家都很熟悉了&#xff0c;那有没有想过这个resetlogs选项为什么要用&#xff1f;什么时候用&#xff1f;它的原理机制是什么&#xff1f;他都起哪些作用&#xff1f;我们都知道数据在启动时候是要做一致性检查的&#xff0c;oracl…

前端的小图标获取

搜索iconfont&#xff0c;里面有很多图标&#xff0c;鼠标移到想要的图标上&#xff0c;然后点击一个类似购物车的图标&#xff0c;然后添加到项目&#xff0c;下载到本地&#xff0c;有一个使用指南的html&#xff0c;然后参照上面的改就好。 把下载好的.css和.eot文件拖到css…

LINQ学习笔记(9) LINQ to Objects---查询内存中对象的集合

从这一篇开始要总结的是LINQ在实际中的应用&#xff0c;首先要总结的是LINQ to Objects&#xff0c;也就是LINQ与程序对象的配合使用。 其中程序对象集合最典型就是与数组的配合使用,如下示例&#xff1a; 1 class Program 2 { 3 static void Main(string[] args) …

$JavaScript(3)

41、渐进增强和优雅降级 渐进增强 &#xff1a;针对低版本浏览器进行构建页面&#xff0c;保证最基本的功能&#xff0c;然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。 优雅降级 &#xff1a;一开始就构建完整的功能&#xff0c;然后再针对低版本浏…

[恢]hdu 1846

2011-12-23 06:07:41 地址&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1846 题意&#xff1a;中文。 mark&#xff1a;考虑n%(m1)是否为0。 代码&#xff1a; # include <stdio.h>int main (){int T, n, m ; scanf ("%d", &T) ;while (T--)…

转:Yupoo(又拍网)的系统架构

Yupoo!&#xff08;又拍网&#xff09; 是目前国内最大的图片服务提供商&#xff0c;整个网站构建于大量的开源软件之上。以下为其使用到的开源软件信息&#xff1a; 操作系统&#xff1a;CentOS、MacOSX、Ubuntu 服务器&#xff1a;Apache、Nginx、Squid 数据库&#xff1a;…

搭建golang webcron 定时任务管理平台

获取源码 $ go get github.com/lisijie/webcron 打开配置文件 conf/app.conf&#xff0c;修改相关配置。 创建数据库webcron&#xff0c;再导入install.sql $ mysql -u username -p -D webcron < install.sql 运行 $ ./webcron 或 $ nohup ./webcron 2>&1 > error…

[恢]hdu 1239

2011-12-31 01:58:02地址&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1239 题意&#xff1a;给m、a、b。求一对素数p,q(p<q)使得p*q<m且p/q > a/b。若有多对&#xff0c;输出p*q最大的一对。 mark&#xff1a;刚开题看了半天&#xff0c;才看明白啥意思。…

浏览器搜索功能的使用

浏览器搜索功能的使用 直接在地址栏中搜索你需要的内容 用浏览器的搜索栏进行搜索 用双引号 " " 进行搜索 转载于:https://www.cnblogs.com/GaoNa/p/11061066.html