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

浅谈数据库事务

 
阅读更多

概要

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

事务的定义
    啥是数据库事务?事务就是….,(此处略去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的执行的大概过程,不知道跟缓存有啥关系

相关推荐

    浅谈数据库事务四大特性

    数据库事务是数据库操作的核心组成部分,它确保了数据库在多用户环境下的稳定性与可靠性。事务的四大特性,也被称为ACID属性,是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性...

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

    浅谈数据库中事务处理和并发控制技术 数据库事务处理和并发控制是数据库管理系统(DBMS)中的核心技术, Guarantees 数据库的可靠性和一致性。本文将详细介绍数据库事务处理和并发控制技术的概念、特性和实现机制。...

    浅谈分布式事务实现技术及应用场景探讨.pdf

    "浅谈分布式事务实现技术及应用场景探讨" 分布式事务是指在分布式系统中,多个节点之间的数据访问和更新操作集合,需要保证事务的原子性、一致性、隔离性和持久性。随着软件系统支持用户数的不断提高,对其架构的...

    浅谈SQL数据库备份.pdf

    "浅谈SQL数据库备份.pdf" 本文将对SQL Server数据库备份进行详细介绍,包括根据数据库向导备份数据库、脚本备份数据库、通过数据库代 理服务器自动备份数据库及通过导出数据库结构和数据脚本备份数据库四种方法。 ...

    浅谈ORACLE数据库的性能优化.pdf

    数据缓冲区存储从数据文件读取的数据,日志缓冲区用于记录事务日志,而共享池则用于SQL和PL/SQL的解析、编译和执行,包括库缓存、数据字典缓存和用户全局区。 2. 初始参数调整 通过初始化参数如DB_BLOCK_SIZE可以...

    从运维角度浅谈MySQL数据库优化 数据库运维.pdf

    《从运维角度浅谈MySQL数据库优化》 MySQL数据库在企业应用中扮演着至关重要的角色,其性能直接影响到系统的响应速度和用户体验。一个成熟的数据库架构并非一蹴而就,而是随着用户量的增长逐步完善的。本文主要探讨...

    浅谈分布式数据库架构.pdf

    设计分布式数据库时,需要考虑如何有效地进行数据分片、副本控制、负载均衡、异步复制、事务管理等关键问题。 在实际应用中,分布式数据库系统如Apache Cassandra、Google Spanner、Amazon DynamoDB等,已逐渐成为...

    浅谈SQL Server数据库访问.pdf

    "浅谈SQL Server数据库访问" 本文主要介绍了Microsoft SQL Server数据库的基本概念和访问方法,讨论了三种常用的数据库访问接口DAO、ODBC和ADO,并提供了一些示例程序来访问SQL Server数据库。此外,本文还介绍了...

    浅谈分布式数据库系统架构.pdf

    3. 全事务支持:分布式数据库系统支持全事务管理,确保数据处理的一致性。系统采用全局事务管理集群来保证分布式事务的一致性,通过集群快照等新技术来解决分布式系统中数据一致性的问题。 分布式数据库系统架构...

    浅谈Oracle数据库安全策略.pdf

    2. 日志管理:Oracle数据库的重做日志(Redo Log)记录了所有的事务更改,是实现事务恢复和崩溃恢复的关键。归档日志(Archived Logs)则保存了已提交的事务,以备在需要时进行恢复。因此,保持日志的完整性和管理好...

    浅谈SpringBoot之事务处理机制

    浅谈SpringBoot之事务处理机制 SpringBoot之事务处理机制是Spring框架中的一种机制,用于管理事务。事务是指一系列的数据库操作,例如插入、更新、删除等,事务处理机制的目的就是为了确保这些操作的原子性、一致性...

    浅谈Oralce数据库的优化.doc

    本文主要探讨了12个关键的优化策略,针对Oracle数据库的SQL查询和事务处理进行了深入分析。 1. 表的顺序选择:在FROM子句中,应将记录条数最少的表放在最右边,以优化Oracle的解析过程。在多表连接查询中,基础表的...

    浅谈分布式数据库管理应用系统的开发.pdf

    此外,系统还需要处理全局事务,协调不同局部站点的数据库管理系统,以保证在整个共享平台上的操作一致性。数据并发控制机制是另一个关键点,它确保在多用户环境下数据的一致性和完整性。同时,系统还需要具备数据...

    浅谈Java技术中的数据库应用

    在Web环境中,Java可以无缝地集成到基于Servlet和JSP的Web应用框架中,如Spring框架,提供了一套完整的事务管理、数据访问和持久化策略,简化了数据库应用的开发和维护。 在Java 2及后续版本中,JDBC得到了进一步的...

    浅谈SQL Server数据库查询性能的优化.pdf

    首先,数据库系统性能的优劣可以通过多个度量标准来评估,包括SQL语句的响应时间、支持并发用户的能力以及系统每天处理的事务量等。影响数据库性能的因素主要包括以下几个方面: 1. SQL语句的设计不当。如果SQL语句...

    DB2 数据库调优浅谈

    ### DB2 数据库调优浅谈 #### 数据库调优的视角 在进行数据库调优时,不同的视角可能会带来不同的解决方案。通常来说,可以从以下几个方面考虑: - **应用优化**:针对应用程序本身的优化,比如查询逻辑、事务...

    浅谈分布式数据库的数据存储.pdf

    透明性体现在用户对数据存储位置的无知,数据的存储、查询和事务处理对用户来说是不可见的,而灵活性则表现在分布式数据库能够支持不同类型的存储需求和应用场景。 分布式数据库系统克服了传统集中式数据库的很多...

    浅谈Oracle数据库系统性能优化策略.pdf

    Oracle数据库系统性能优化是数据库管理中的重要环节,它涉及到数据库设计、硬件配置、操作系统设置、数据库参数调整以及应用程序优化等多个方面。在设计阶段进行性能优化是最经济且效果最佳的策略,因为一旦系统上线...

    浅谈Oracle数据库性能调优 (2).pdf

    【Oracle 数据库性能调优】 Oracle数据库性能调优是一个DBA(数据库管理员)的重要任务,其目的是提升数据库的运行效率,降低存储空间占用,并优化查询性能。本文将围绕Oracle数据库的性能优化方法展开讨论,主要关注...

Global site tag (gtag.js) - Google Analytics