何为数据库事务.PDF

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
何为数据库事务

Spring 虽然提供了灵活方便的事务管理功能,但这些功能都是基于底层数据库本身的事务 处理机制工作的。要深入了解Spring 的事务管理和配置,有必要先对数据库事务的基础知 识进行学习。 何为数据库事务 “一荣俱荣,一损俱损”这句话很能体现事务的思想,很多复杂的事物要分步进行,但它们组 成一个整体,要么整体生效,要么整体失效。这种思想反映到数据库上,就是多个SQL 语 句,要么所有执行成功,要么所有执行失败。 数据库事务有严格的定义,它必须同时满足 4 个特性:原子性(Atomic )、一致性 (Consistency )、隔离性(Isolation)和持久性(Durabiliy),简称为ACID 。下面是对每 个特性的说明。 原子性:表示组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有 的操作执行成功,整个事务才提交,事务中任何一个数据库操作失败,已经执行的任 何操作都必须撤销,让数据库返回到初始状态。 一致性:事务操作成功后,数据库所处的状态和它的业务规则是一致的,即数据不会 被破坏。如从A 账户转账100 元到B 账户,不管操作成功与否,A 和B 的存款总额是 不变的。 隔离性:在并发数据操作时,不同的事务拥有各自的数据空间,它们的操作不会对对 方产生干扰。准确地说,并非要求做到完全无干扰,数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性越好,但并发性越弱。 持久性:一旦事务提交成功后,事务中所有的数据操作都必须被持久化到数据库中, 即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证能够通过某种机 制恢复数据。 在这些事务特性中,数据“一致性”是最终目标,其他的特性都是为达到这个目标的措施、要 求或手段。 数据库管理系统一般采用重执行日志保证原子性、一致性和持久性,重执行日志记录了数据 库变化的每一个动作,数据库在一个事务中执行一部分操作后发生错误退出,数据库即可以 根据重执行日志撤销已经执行的操作。此外,对于已经提交的事务,即使数据库崩溃,在重 启数据库时也能够根据日志对尚未持久化的数据进行相应的重执行操作。 和Java 程序采用对象锁机制进行线程同步类似,数据库管理系统采用数据库锁机制保证事 务的隔离性。当多个事务试图对相同的数据进行操作时,只有持有锁的事务才能操作数据, 直到前一个事务完成后,后面的事务才有机会对数据进行操作。Oracle 数据库还使用了数 据版本的机制,在回滚段为数据的每个变化都保存一个版本,使数据的更改不影响数据的读 取。 数据并发的问题 一个数据库可能拥有多个访问客户端,这些客户端都可以并发方式访问数据库。数据库中的 相同数据可能同时被多个事务访问,如果没有采取必要的隔离措施,就会导致各种并发问题, 破坏数据的完整性。这些问题可以归结为5 类,包括3 类数据读问题(脏读、不可重复读 和幻象读)以及2 类数据更新问题(第一类丢失更新和第二类丢失更新)。下面,我们分 别通过实例讲解引发问题的场景。 脏读(dirty read ) A 事务读取B 事务尚未提交的更改数据,并在这个数据的基础上操作。如果恰巧B 事务回 滚,那么A 事务读到的数据根本是不被承认的。来看取款事务和转账事务并发时引发的脏 读场景: 在这个场景中,B 希望取款500 元而后又撤销了动作,而A 往相同的账户中转账 100 元, 就因为A 事务读取了B 事务尚未提交的数据,因而造成账户白白丢失了500 元。在Oracle 数据库中,不会发生脏读的情况。 引用 一个有结巴的人在饮料店柜台前转悠,老板很热情地迎上来说:“喝一瓶?”结巴连忙说:“我… 喝…喝…”老板麻利地打开易拉罐递给结巴,结巴终于憋出了他的那句话:“我…喝…喝…喝 不起啊!” 不可重复读(unrepeatable read) 不可重复读是指A 事务读取了B 事务已经提交的更改数据。假设A 在取款事务的过程中, B 往该账户转账 100 元,A 两次读取账户的余额发生不一致: 在同一事务中,T4 时间点和T7 时间点读取账户存款余额不一样。 幻象读(phantom read) A 事务读取B 事务提交的新增数据,这时A 事务将出现幻象读的问题。幻象读一般发生在 计算统计数据的事务中,举一个例子,假设银行系统在同一个事务中,两次统计存款账户的 总金额,在两次统计过程中,刚好新增了一个存款账户,并存入100 元,这时,两次统计 的总金额将不一致: 如果新增数据刚好满足事务的查询条件,这个新数据就进

文档评论(0)

magui + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8140007116000003

1亿VIP精品文档

相关文档