`
yangshen998
  • 浏览: 1247832 次
文章分类
社区版块
存档分类
最新评论

浅谈数据库事务

 
阅读更多

概要

    该问讲述了我对数据库事务的一些理解,由于本人才疏学浅,无法保证这些内容的正确性望各位明鉴,希望能够误导你,哦是帮到你!
文章后面列出了一些大牛的文章,供大家参考。

事务的定义
    啥是数据库事务?事务就是….,(此处略去200字)

一个事务的典型例子(中西结合版)
   Mr张三给Mr李四转帐….(此出略去1000字)

 

到底嘛是事务

  上面分别给出了事务的定义与一个典型场境,相信无论你是菜鸟还是小鸟看到上面这段文时时都会笑而不语 (嘿嘿………哥在这里已经看见你们邪恶的表情了),好了下面我们来点别的。

测试如下问题:
  有一张表MyTable有100万条记录,假设使用Delete语句执行删除全部记录要20分钟,你在查询分析器里输入如下代码 “Delete From MyTable” 然后按F5, 执行5分钟左右你把电源拔了(注意这个动作要猛、准、狠). 问题是:当你重新启动电脑后,你的MyTable表里还有多少记录呢?

………
……….
哥在这里休息5分钟再写,以便您能完成上面的测试…
………
……………..
您好!很高兴您成功启动了电脑,如果一切正常(关于太阳带电粒子的问题我们这里先不考虑)您的MyTable表中应该还有100万条记录。
这就是传说中的原子性--A,要么全部删完,要么一条多没删除,顺便提下你的任何SQL 即使没加Begin Tran 都是在事务环境下远行的,因为上面那个转帐的例子导致哥许多年来天真的认为不加Begin Tran的SQL语句是没有事务的,其实
Delete From MyTable

Begin Tran
  Delete from Mytable
  If @@Error >0
    Rollback;
Coomit;
是等价的,前一个语句就是那个天杀的SQL自动事务模式. 好了我们继续,您在次输入 Delete From MyTable,注意饿(请确保您的MyTable表中有100万条记录),不然一下就删除没了。
然后新开个查询窗口输入Select * from MyTableA, 接着F5运行,你会发现运行正常,查询语句显示MyTableA表中的28条记录,注意我上面说的是MyTableA, 如果这个时候你执行Select * From MyTable 会显示什么呢…答案是啥都没有,只显示[正在执行查询....]直接到您的Delete完成,然后显示的结果是没有任何记录的MyTable表。
这就是所谓的隔离性-I,注意上面的Select * From MyTable也是在事务环境下运行的,别拿查询不当事务饿,而上面的操作我们模拟了两个并发运行的事务,在Delete完成或取消前,
Select被挡在了外面,以免您的Select语句整出54万条或别的什么数目的记录来。
对数据库来说你执行Delete* From MyTable,后只会有两种结果,成功或失败,如果执行成功,那么在执行删除前语句Select * From MyTable应该显示100万,而在删除执行后所有的查询只能看到0条记录,就是不允许你看到它删除中的54万或38万条记录什么的,这就体现了一致性-C,这个比较抽象请先忽略掉把。
好了说下持久性-D,说到持久我们就会想到硬盘,我们上面的Delete语句执行后被删除的数据就应该从.mdf文件中清除以实现持久化,不过在执行删除前后对比.mdf文件大小您可能要失望了,您会发现.mdf没有变小甚至可能变大,造成功这个现象的原因是,数据库文件是按8K一页为单位来组织管理的,数据库记录就写在这些页上,在您删除数据后这些页面没有被删除或者说将磁盘空间还给操作系统,只是将这些页标记为空以便以后使用,不过您确实能观察到.ldf文件变大了。ACID(事务),可以看作是关系数据库的一个标准,就像HTML一样,比方w3c定义了一个A标签,那么你做浏览器开发的就要在程序上实现对a标签的支持,而通常来说关系数据库产品要实现ACID标准一般多是通过”日志”与”锁”技术。

 现在我们来大致来整理下删除的具体过程

1.查询语句解析:数据库接到您的删除命令后计算出这次删除要涉及的数据或记录(页面)
2.读取对应页面到缓存并锁定:数据库引擎会读取这些页面并加上工享锁,防止它事务(也就是其他人)进行写操作。
3.写日志:将这些将被删除页面做个备份写到log中(这个操作是真真切切要先搞完的),
4.获取排它锁禁止其它进程的一切读写操作,这步完成时就是你看到上面那个Select 一直处于执行中的原因了.
4.修改缓存中的页面,并记录事务点到日志中,释放排它锁


至于缓存的页面啥时候写到.mdf中就不是事务要关心的事情了,反正读写数据都是针对缓存来说,而缓存与数据库文件之间的一致性,也是通过日志和一个叫检查点的机制来实现的。

好了针对上面的执行模型再考虑我们那100万条记录的删除情况,当执行到5分钟时根本没到事务提交点(.ldf中没记录这次删除完成的点),因此当您重新启动电脑后,数据库服务器会根据日志进行一致性检测,根据日志,将上面那个删除了一半的操作撤消(因为日志里保存了删除的页面,如果有必要系统会据此来还原数据),当然如果您在执行了19分59秒时把电源拔了那么事务可能已经完成并提交了,但是缓存中的页面没写入.mdf,不过这个也不是问题,根据日志文件的记录,数据库会再做一次“删除”,以保证.mdf处于一直状态,为了避免干扰在完成这些工作前您是无法访问数据库的,当然数据库在进行上面的操作时也会写日志,防止某些变态的人又突然把电源拔掉。


下面我们看下另外一个场景

有个卖火车票的网站,上面有个可卖火车票的列表,有很多群众不停的刷新,一旦发现他要的票,就双击进入购卖详细页(ticketDetail.aspx)然后[提交购买]。
好了那个数据表是 : ticket(Id,status,buyerId,….),字段说明:车票编号、状态(可买,已买)、购买者编号.

[提交购买]对应的操作是
Update ticket status=’已买’,buyerId=@buyerId where Id=@Id

聪明绝顶的你一看这个可能不行的,这一语句的问题是没检测车票是否已被卖出,这样后面的提交的总是覆盖掉前面的提交。

改进一

If (Select count(*) from ticket where status=’可买’ and Id=@Id )=1
Update ticket status=’已买’,buyerId=@buyerId where Id=@Id

但是由于群众太多上面的代码有些时候会出问题,张三,李四,王五他们同时买Id=1的车票,页面提示他们全都购买成功了,不过最后事实是李四拿到了票,因为buyerId记录了李四的编号。

改进二
Update ticket status=’已买’ ,buyerId=@buyerId where Id=@Id and @status=’可买’
我们通过update 返回值是否 >0来判断是否购买成功,这个方案加入了版本控制字段status(SQL2005中可以使用timestamp来达到同样的目的),而且语句只有一句了。
现在我们分析下
当张三跟李四同时提交时,出现了A,B两个并发事务,
缓存中首先加载where条件对应的数据页,并将更新锁分配给A或B中的一个,这里假设是A获得了更新锁(更新锁之间互不兼容)
A将U锁升级成X锁完成更新操作。而B在A进程完成后再次尝试获取对应where条件的数据页的更新锁,但是无法找到对应条件的数据页了,因此更新失败。

 

0
0
分享到:
评论
1 楼 jyjava 2012-01-17  
lz,这个文章怎么到头版的啊,讲了事务的隔离和一个sql的执行的大概过程,不知道跟缓存有啥关系

相关推荐

    浅谈数据库事务四大特性

    主要介绍了浅谈数据库事务四大特性,小编觉得挺不错的,这里分享给大家,供需要的朋友参考。

    浅谈数据库中事务处理和并发控制技术

    该文档主要浅谈了数据库事务处理和并发控制的技术,可以作为初学者的参考文档

    实时数据库系统的设计浅谈.docx

    实时数据库系统的设计浅谈全文共3页,当前为第1页。实时数据库系统的设计浅谈全文共3页,当前为第1页。实时数据库系统的设计浅谈 实时数据库系统的设计浅谈全文共3页,当前为第1页。 实时数据库系统的设计浅谈全文共...

    2020中国数据库技术大会PPT合集(77份).zip

    2020中国数据库技术大会PPT合集(77份)。 在线分析进入Fast Data...浅谈数据库服务和架构演讲 平安数据库开发质量管理实践 面向生产力的数据架构演进 每秒万级订单的数据库优化实践 流程IT数据库上云实践 等等文档

    浅谈oracle rac和分布式数据库的区别

    2.rac事务上没有协调的问题,而分布式数据库由于是多个库需要事务上的协调; 3.分布式数据库数据是分散存储在各个节点,但是设备一般都是廉价的设备,经常出现节点故障,不过对用户来说是透明的;.RAC是ORACLE集群...

    浅谈多媒体数据库体系结构 (2011年)

    多媒体数据库管理系统与传统的数据库系统一样,要提供对数据的管理、查询和事务处理等功能。除此之外,对于多媒体数据库管理系统必须要求它有独立于媒体的变化;由于其具有面向对象的特征,而往往需要根据不同的对象而 ...

    嵌入式系统/ARM技术中的浅谈事务管理器的事务恢复处理方案

    随来社会的进步,计算机的广泛应用,很多事务处理过程中事务的恢复工作一般依赖于计算机数据库管理系统,而事务管理器必须做好分布式事务处理的事务恢复处理。这需要做好二个阶段的工作:在正常的事务处理过程中,...

    MYSQL 浅谈MyISAM 存储引擎

    注意:如果你在数据库进行事务操作,但是事务无法成功,你就要看你的表引擎了,看这种引擎是否支持事务。 >> 下面请看innodb中的事务操作   > 存储结构:数据文件(.MYD),索引文件(.MYI)和结构文

    详解SQL Server中的事务与锁问题

    “浅谈SQL Server 事务与锁”这个专题共分两篇,上篇主讲事务及事务一致性问题,并简略的提及一下锁的种类和锁的控制级别。 下篇主讲SQL Server中的锁机制,锁控制级别和死锁的若干问题。 二 事务 1 何为事务  ...

    浅谈MySql的存储引擎(表类型)

    什么是MySql数据库 通常意义上,数据库也就是...目前,它可以提供的功能有:支持sql语言、子查询、存储过程、触发器、视图、索引、事务、锁、外键约束和影像复制等。在后期,我们会详细讲解这些功能。 同Oracle 和SQ

    浅谈领域模型驱动中表的设计方法

     层次 职责 表现层 提供服务、显示信息 领域层(业务逻辑) 逻辑、系统中真正的核心 数据源层 与数据库、消息系统、事务管理器及其他软件包通信分层基本原则领域层和数据源层绝对不要依赖于表现层;...

    浅谈oracle SCN机制

    在理解SCN之前,我们先看下oracle事务中的数据变化是如何写入数据文件的: 1、事务开始; 2、在buffer cache中找到需要的数据块,如果没有找到,则从数据文件中载入buffer cache中; 3、事务修改buffer cache的...

    浅谈MySQL存储引擎选择 InnoDB与MyISAM的优缺点分析

    下面先让我们回答一些问题: ◆你的数据库有外键吗? ◆你需要事务支持吗? ◆你需要全文索引吗? ◆你经常使用什么样的查询模式? ◆你的数据有多大? 思考上面这些问题可以让你找到合适的方向,但那并不是绝对的。如果...

    浅谈选择mysql存储引擎的标准

    InnoDB是MySQL的默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。 建议使用MySQL5.5及以后的版本,因为这个版本及以后的...

    浅谈Python实现Apriori算法介绍

    导读: 随着大数据概念的火热,啤酒与尿布的故事广为人知。我们如何发现买啤酒的人往往也会买尿布这一规律?数据挖掘中的用于挖掘频繁项集和关联规则的Apriori算法可以告诉我们。本文首先对Apriori算法进行简介,...

    浅谈MySQL中四种常用存储引擎

    不支持事务、也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表 支持3种不同的存储格式,分别是:静态表;动态表;压缩表 静态表:表中的字段都...

    浅谈php中mysql与mysqli的区别分析

    其次,mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。应用比较多的地方是 mysqli的事务。比如下面的示例:复制代码 代码如下:$mysqli = new mysqli(‘localhost’,’root’,”,’DB...

    浅谈InnoDB隔离模式的使用对MySQL性能造成的影响

    在这篇文章里我将讨论一个相关的主题 – InnoDB 事务隔离模式,还有它们与MVCC(多版本并发控制)的关系,以及它们是如何影响MySQL性能的。 MySQL手册提供了一个关于MySQL支持的事务隔离模式的恰当描述 – 在这里我...

Global site tag (gtag.js) - Google Analytics