`
阿尔萨斯
  • 浏览: 4171242 次
社区版块
存档分类
最新评论

事务日志回滚机制研究

 
阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>

摘要:


 隔离级别的概念

企业级的数据库每一秒钟都可能应付成千上万的并发访问,因而带来了并发控制的问题。由数据库理论可知,由于并发访问,在不可预料的时刻可能引发如下几个可以预料的问题:

  脏读:包含未提交数据的读取。例如,事务1 更改了某行。事务2 在事务1 提交更改之前读取已更改的行。如果事务1 回滚更改,则事务2 便读取了逻辑上从未存在过的行。

  不可重复读取:当某个事务不止一次读取同一行,并且一个单独的事务在两次(或多次)读取之间修改该行时,因为在同一个事务内的多次读取之间修改了该行,所以每次读取都生成不同值,从而引发不一致问题。

  幻象:通过一个任务,在以前由另一个尚未提交其事务的任务读取的行的范围中插入新行或删除现有行。带有未提交事务的任务由于该范围中行数的更改而无法重复其原始读取。

如你所想,这些情况发生的根本原因都是因为在并发访问的时候,没有一个机制避免交叉存取所造成的。而隔离级别的设置,正是为了避免这些情况的发生。事务准备接受不一致数据的级别称为隔离级别。隔离级别是一个事务必须与其它事务进行隔离的程度。较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。

根据隔离级别的不同,DBMS为并行访问提供不同的互斥保证。在SQL Server数据库中,提供四种隔离级别:未提交读、提交读、可重复读、可串行读。这四种隔离级别可以不同程度地保证并发的数据完整性:

隔离级别 脏 读 不可重复读取 幻 像
未提交读
提交读
可重复读
可串行读

可以看出,“可串行读”提供了最高级别的隔离,这时并发事务的执行结果将与串行执行的完全一致。如前所述,最高级别的隔离也就意味着最低程度的并发,因此,在此隔离级别下,数据库的服务效率事实上是比较低的。尽管可串行性对于事务确保数据库中的数据在所有时间内的正确性相当重要,然而许多事务并不总是要求完全的隔离。例如,多个作者工作于同一本书的不同章节。新章节可以在任意时候提交到项目中。但是,对于已经编辑过的章节,没有编辑人员的批准,作者不能对此章节进行任何更改。这样,尽管有未编辑的新章节,但编辑人员仍可以确保在任意时间该书籍项目的正确性。编辑人员可以查看以前编辑的章节以及最近提交的章节。这样,其它的几种隔离级别也有其存在的意义。

在.net框架中,事务的隔离级别是由枚举System.Data.IsolationLevel所定义的:

[Flags]
[Serializable]
public enum IsolationLevel

其成员及相应的含义如下:

成 员 含 义
Chaos 无法改写隔离级别更高的事务中的挂起的更改。
ReadCommitted 在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。
ReadUncommitted 可以进行脏读,意思是说,不发布共享锁,也不接受独占锁。
RepeatableRead 在查询中使用的所有数据上放置锁,以防止其他用户更新这些数据。防止不可重复的读取,但是仍可以有幻像行。
Serializable 在DataSet上放置范围锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行。
Unspecified 正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。

显而意见,数据库的四个隔离级别在这里都有映射。

默认的情况下,SQL Server使用ReadCommitted(提交读)隔离级别。

关于隔离级别的最后一点就是如果你在事务执行的过程中改变了隔离级别,那么后面的命名都在最新的隔离级别下执行——隔离级别的改变是立即生效的。有了这一点,你可以在你的事务中更灵活地使用隔离级别从而达到更高的效率和并发安全性。

  最后的忠告

无疑,引入事务处理是应对可能出现的数据错误的好方法,但是也应该看到事务处理需要付出的巨大代价——用于存储点、回滚和并发控制所需要的CPU时间和存储空间。




分享到:
评论

相关推荐

    自修复数据库系统日志机制研究 (2010年)

    选择性恢复使得一个自修复数据库系统在受到恶意攻击后,只需撤销历史中受到恶意事务感染的那部分操作,无需回滚整段历史,但要求日志机制支持对事务间依赖关系的追踪及前像数据的长期保存。通过分析传统日志机制的...

    MySQL事务与锁机制详解

    在InnoDB里面,是通过undo log来实现的,它记录了数据修改之前的值(逻辑日志),一旦发生异常,就可以用undo log来实现回滚操作。 一致性(Consistency):事务执行的前后数据的完整性保持一致。 隔离性(Isolation...

    基于SpringBoot的秒杀系统设计与实现.zip

    库存管理 :系统实现了实时库存扣减和回滚机制,确保库存数据的准确性。安全性 :采用令牌桶限流算法,防止恶意用户刷单,保障正常用户的购买体验。可扩展性 :系统架构灵活,可根据业务需求进行水平扩展,满足不断...

    SYBASE_12.0数据库维护快速参考手册

    3.1.3 为什么有时候数据库事务日志满了,使用Dump transaction with no-log仍不能截断日志? 66 3.1.4 即使表上没有建立索引,为什么BCP操作仍记日志? 66 3.1.5 如何生成bcp命令文件(以pubs2为例)? 66 3.1.6 如何...

    springTransaction.rar

    里面为一个演示spring事务传播机制的小demo。简单实现转账功能,通过添加注解调整传播级别,同时通过日志打印查看sql是否执行,在mysql中的数据是否发生了变化(操作提交还是回滚了)。

    sql2000 Log Explorer4.2(含注册码)+汉化

    如果不选用了删除事务日志中不活动的条目 再用Log explorer打试图看日志时,就能看到原来的日志 2)修改了其中一个表中的部分数据,此时用Log explorer看日志,可以作日志恢复 3)然后恢复备份,(注意:恢复是断开...

    SQLite教程(十二):锁和并发控制详解

    主要介绍了SQLite教程(十二):锁和并发控制详解,本文讲解了锁和并发控制机制概述、文件锁、回滚日志、数据写入、SQL级别的事务控制等内容,需要的朋友可以参考下

    【《数据库与信息系统》复习题及答案】第5章数据库管理与保护.pdf

    本题中每隔 2 小时⽣成⼀个事务备份日志, 最后⼀次备份 是早晨 8 点。使用完整数据库备份可恢复到当天凌晨 2:00 的数据库状态,再使用差异备份 可以恢复到上午 8:00 的数据库状态。 8.若数据库中只包含成功事务...

    神通数据库-数据库快速入门.pdf

    时使用事务日志,将所有未完成的事务自动地回滚到系统出现故障的位置。 事务管理特性,强制保持事务的原子性和一致性。事务启动之后,就必须成功完成,否则数据库系统将 撤消该事务启动之后对数据所作的所有修改。 ...

    Log Explorer4.2帮助文档

    备份时选用了删除事务日志中不活动的条目 再用Log explorer打试图看日志时 提示No log recorders found that match the filter,would you like to view unfiltered data 选择yes 就看不到刚才的记录了 如果不...

    seata1.3.0.zip

    首先,seata库下面的事务处理表里面有遗留事务处理记录,然后你会发现tc-server端日志里面会持续刷上述日志,tc-server会持续的尝试回滚该事务。最遗憾的是:哪怕客户端服务重启,也不会回滚该事务!!! 不过还好...

    数据库系统实现

    本书适合于作为高等院校计算机专业研究生的教材或本科生的教学参考书,也适合作为从事相关研究或开发工作的专业技术人员的高级参考资料 译者序 前言 第1章 DBMS实现概述 1.1 Megatr on 2000数据库系统介绍 ...

    Log Explorer for SQL Server v4.22 含注册机

    备份时选用了删除事务日志中不活动的条目 再用Log explorer打试图看日志时 提示No log recorders found that match the filter,would you like to view unfiltered data 选择yes 就看不到刚才的记录了 如果不...

    Log Explorer for SQL Server v4.22

    如果不选用了删除事务日志中不活动的条目 再用Log explorer打试图看日志时,就能看到原来的日志 2)修改了其中一个表中的部分数据,此时用Log explorer看日志,可以作日志恢复 3)然后恢复备份,(注意:恢复是断开...

    MySQL 使用规范总结

    事务日志记录真正的数据库事务,但更重要的是数据崩溃恢复和回滚。 基于 InooDB方式的IO,能给予更安全数据保护和更好性能表现。另外,在大多数的情况下,行级锁可以提供更高的并发性能,因为用户只锁定他们正在写的...

    深入解析Oracle.DBA入门进阶与诊断案例

    8.9 回滚机制的深入研究 361 8.9.1 从DML更新事务开始 361 8.9.2 获得事务信息 362 8.9.3 获得回滚段名称并转储段头信息 362 8.9.4 获得跟踪文件信息 363 8.9.5 转储前镜像信息 364 8.9.6 转储数据块...

    redisStudy.zip

    但是redis的事务并不支持回滚,即可以两个命令可以同时提交执行,但是如果有失败,成功的也不会回滚 5.你们公司使用的是什么集群模式 看你写的项目经验,如果你们公司数据量特别大,公司用缓存牛逼,就说Redis...

    SQLite教程(十一):临时文件

    一、简介:  尽管SQLite的数据库是由单一文件构成,然而事实上在SQLite运行... 回滚日志。  2). 主数据库日志。  3). SQL语句日志。  4). 临时数据库文件。  5). 视图和子查询的临时持久化文件。  6). 临时索引文

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    9.4 提交和回滚处理 289 9.4.1 COMMIT做什么? 289 9.4.2 ROLLBACK做什么? 296 9.5 分析redo 297 9.5.1 测量redo 298 9.5.2 redo生成和BEFORE/AFTER触发器 300 9.5.3 我能关掉重做日志生成吗? 306 9.5.4 为...

Global site tag (gtag.js) - Google Analytics