星空网站建设

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2|回复: 0

分析SQL Server与Oracle数据库事务处理横向对比 -

[复制链接]
  • TA的每日心情
    开心
    6 分钟前
  • 签到天数: 43 天

    [LV.5]常住居民I

    10万

    主题

    40

    回帖

    30万

    积分

    超级版主

    Rank: 8Rank: 8

    积分
    304055
    发表于 2025-8-2 07:22:01 | 显示全部楼层 |阅读模式

    简介

    本文讲述MSSQLS和O数据库事务处理的差异性,以及O如何对事务处理的现。

    什么是事务

    数据库事务(DT)是一组数据库操作的处理单元。事务符合ACID的特性:

    A:原子性,要么全部要么一所有。AN

    C:一致性,所有依赖关系以及约束一致。

    I:分离性,不同事务不互相影响。

    D:持久性,提交事务的数据需要持久化。

    为什么要使用事务

    现事务主要有两大功能:

    1保证数据库的(一致性状态),保持所有依赖关系以及约束一致)。哪怕数据库管理系统出现故障时(例如断电),也能恢复到一致性状态。例如一个银行转帐系统,张给李四转3000圆RMB,张帐号上减3000和李四帐号上加3000需要同时完成,否则系统的帐就不平了。也例如有些销售系统的汇总表和明细表,是一个主表和一个从表,需要同步更新。

    2并发时分离不同事务操作。例如编辑过程中的数据不给其他事务查询到。这也是相对的,在特效需求下可能要支持(脏读),但不是这里讨论的范围了。

    SQLS2022的事务类型

    1自动提交事务AT

    这是SQLS默认的事务类型,每一条单独的SQL语句(SQL)都是单独的一个事务,语句执行完毕后自动提交。调用方不需要手工控制事务流程。

    2显示事务ET

    调用方需要调用API或者使用T-SQL的BEGINTRANSACTION语句来打开事务。需要调用COMMIT或者ROLLBACKTRANSACTION来提交或者回滚。

    3隐式事务IT

    使用SETIMPLICIT_TRANSACTIONSON把事务模式变成隐式模式。调用方不需要执行BEGINTRANSACTION语句来打开事务。数据库引擎执行到SQL语句的时候自动打开事务。调用方需要调用COMMIT或者ROLLBACKTRANSACTION来提交或者回滚。当数据库引擎执行下一个SQL语句时又自动打开一个新事务。

    参考:CT(DE)

    O的事务类型

    O的事务处理类型有点像SQLS的隐式事务。当执行到首个可执行的SQL语句时自动打开事务,然后需要调用方执行或者来提交或者回滚事务,如果有DDL语句,O也会自动提交事务的。

    参考:TM

    O的事务的现

    O的结构分逻辑上和物理上的区别。逻辑上的结构是表空间,而物理上的结构是数据文件。

    逻辑现

    O下现事务在逻辑上是由UT来现的。UT包含US(段),而US包含UD。UD是支持事务的逻辑单元。

    UD用于保存修改前后的数据,以支持回滚,长时间查询,和查询,以及失败事务恢复的功能。

    由于有了UD,回滚事务变得容易了,因为UD保存了修改前后的数据,保证了事务的原子性。失败事务恢复和事务回滚类似,当络中断或者其他原因导致事务异常停止,数据库引擎可以恢复到一致性状态。

    同时UD也支持长时间查询(R-),例如有表格T,主键为,有字段为1,数据如下,尽管只有4条数据,假设需要很长时间进行查询。

    1

    1A

    2B

    3C

    4D

    事务一开始查询,一直没结束,而事务二开始修改为1的数据为Z,事务二进行提交,数据变成下面的表格。但是事务一查询结束的时候还是读出A,B,C,D,因为查询是从U中读出照。

    1

    1Z

    2B

    3C

    4D

    F查询是O10引进的功能,可以查询出提交之后修改之前的数据,例如上面例子事务在事务二提交后想查询出A,B,C,D可以通过F查询来完成。这也是有UD来支持的。

    物理现

    从上面的逻辑现看,只是知道了事务以及UD的作用,还不清楚O对事务的支持到底怎么现的。下面从物理结构上讲述O怎么对事务进行支持。请先看一个物理结构图。

    为了简化,我只是用个人的语言讲述和事务有关的部件。SGA可以理解为全局内存。其中DBC存放的是从数据文件中读取的数据缓存。紫色的圆柱体为数据文件。RLB为重做日志缓存,也就是保存日志的内存块,一切的数据的修改都会记录在RLB里面。例如用回事务二更新为1数据的例子。当事务二更新为1数据从A到Z。O数据库引擎会把为1的数据的,修改前数据A以及修改后数据Z都记录在RLB里面。如果事务二继续更新为2的数据为Y,那么为2的数据的,修改前数据B以及修改后数据Y也记录到RLB里面。每一笔数据都记录,而且是流水线性记录。一旦事务二进行提交,LGWR进程(LW,日志写进程)就会把RLB的数据按顺序写到LD里面,也就是日志数据文件里面,当写日志文件完成,O数据库引擎会生成一个SCN(,系统更新号),到这时候O数据库引擎会通知调用方提交完成了。这里可以看到O在提交的时候不必要把更新数据写回数据文件,而是写到日志文件里面。因为顺序写线性的日志文件速度很多,而写数据文件是需要随机读写。由于线性记录和SCN号控制,数据库引擎可以通过(重做日志文件)的操作得到比较新的数据。当然在C的时候数据文件是比较终还是会更新的,只是说事务提交的时候更新数据文件不是必须步骤,这样能很大的提高性能。

    由于这个机制,回滚变得很简单,要读没提交前之前的SCN是很容易的事情。

    对于初学者关于数据库事务处理的建议

    我自己也是从新手一步步走过来,现在也不是老鸟,算是有点经验,如果是刚入门的同学,你觉得有用就看一下,没用就过了。

    对于数据库事务的处理,开始的时候不需要很深入了解数据库的原理,当然以后还是需要了解的,先级排后而已。高先级如下:

    首先,事务不是什么高深神秘的东西,我从入行开始所做的所有系统,包括现在的嵌入式系统,都用到事务。我并不觉得大部分系统事务有什么问题,只是一些约束和同步机制,真的有问题从自身系统设计角度看,不一定说从数据库技术角度去找解决方法。例如O的长时间查询如果UD(历史数据)给覆盖了,O会抛出异常"ORA-01555:”,如果出现这种问题,我会从自身系统设计角度入手,为什么有那么大的查询,为什么在这个查询中其他事务会更新数据,这些查询是否只是查一次就够了,查的过程是否需要锁住表等等。然而这个问题可以通过数据库调解决,但是我想问题的角度首先是从自身系统设计出发。

    第二,要知道的是不同数据库的事务类型的区别,例如MSSQLS是默认是自动提交事务,用的时候需要知道每个语句都有单独的事务在操作。而O是类似于隐式事务,必须手工或者。

    第,使用事务要知道一一对应,特别是嵌套事务的时候,有始有终。很多问题时候发生终的时候,注意异常处理需要结束已经打开的事务。

    首点是心理问题,第二点是技术问题,做好我觉得就可以入门开发系统了。以后碰到问题在一步步深入。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表