`
m635674608
  • 浏览: 5041862 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

数据库事务原子性、一致性是怎样实现的?

 
阅读更多
作者:郁白
链接:http://www.zhihu.com/question/30272728/answer/71927112
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

讨论数据库的事务原子性,先看最极端的情况,即全局一把锁,所有事务排队执行,这种情况下没有原子性问题,因为所有事务看到的都是在自己之前已经提交的数据。

为了提高性能,充分利用多核,我们需要让多个事务能够并行的执行,但是还要保证这些事务“看起来”是串行执行的(external consistency)。这里需要考虑事务的三种关系,即读与读的关系,写与写的关系,读与写的关系。

  1. 读事务与读事务的关系最简单,因为不对数据进行修改,因此读与读之间可以直接并行
  2. 写事务与写事务的关系,对同一条记录的修改,需要保证串行,不能出现lost update的情况,一般通过行锁(oracle/mysql/oceanbase),或者事先通过SQL分析将可能冲突的事务排队后执行(calvin/oceanbase)
  3. 读事务与写事务的关系,这个最复杂,因为数据库操作中,几乎没有只写的情况,一般都是“read-modify-write”,比如最简单的update ... where 还有 update set c=c+1 whete,绝大部分写事务都是在读取一些数据之后,再修改数据,我们称这类事务为“读写事务”。因此读与写关系,会涉及两类关系:
    1. 只读事务与读写事务的关系,一般使用多版本的方式保存数据,每个事务分配一个全局唯一且递增的“事务版本号”,更新数据时将事务版本号也保存在数据中。在全局维护一个“最大已提交的”版本号(committed version),一般就是一个64或128位的整数,每个只读事务开始时,原子的读取这个commited version,读取数据时,只读取版本号小于等于它的内容。多版本的实现方式各家不尽相同;数据存储方面oracle与innodb都是使用data block + undo block的方式,历史版本保存在undo block中,oceanbase内存引擎则简单的将一行所有的修改历史串成反向链表;对于事务版本号,oracle与oceanbase都在事务提交时生成版本号,可以保证版本号的大小严格遵守事务提交顺序,但是需要在事务提交时(oceanbase)或提交后(oracle)将事务版本号回填到数据内容中,mysql则简单的在事务开启时生成版本号,因此读取逻辑相对复杂,需要过滤掉开始事务时尚未结束事务对数据的修改。
    2. 读写事务之间的关系,这里需要考虑的是一个读写事务T1在执行过程中,它刚刚读过的数据被其他事务修改的情况,这种情况下T1需要回滚重做(单语句事务)或报告事务冲突(交互型事务),一般的做法是在T1提交时对涉及到的行加锁后检查版本号或内容,在read committed隔离级别下这个特性并非标准所要求,但是oracle/mysql/oceanbase都在语句级别实现了,也成为了事实标准,按oracle的叫法叫做transaction set consistency
参考文献:
[1] Thomson A, Diamond T, Weng S C, et al. Calvin: fast distributed transactions for partitioned database systems[C]//Proceedings of the 2012 ACM SIGMOD International Conference on Management of Data. ACM, 2012: 1-12. MLA
[2] Berenson H, Bernstein P, Gray J, et al. A critique of ANSI SQL isolation levels[C]//ACM SIGMOD Record. ACM, 1995, 24(2): 1-10.
[3] LI Kai,HAN Fu-Sheng. Memory transaction engine of OceanBase[J]. Journal of East China Normal University(Natural Sc, 2014, 2014(5): 147-163.
[4] Lewis J. Oracle Core: Essential Internals for DBAs and Developers[M]. Apress, 2011.
 
作者:韩忠康
链接:http://www.zhihu.com/question/30272728/answer/95908054
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原子性:一个事务内的所有SQL操作是一个整体。都执行成功才算整个事务成功。如果某个失败,则必须要会退到事务执行之前的状态,执行成功的SQL需要被撤销。

innodb通过undo log和redo log来实现。


事务中,每当执行一条SQL语句对数据产生了影响,就会记录下来与之相反的操作到undo log(撤销日志)中,例如,更新会记录之前的状态,删除会形成insert,添加会形成delete,一旦事务被回滚,则执行undo log中记录的操作,来完成恢复到之前的状态。这里是个 逻辑恢复哦!
同时,每当执行一条事务中的SQL,会将操作记录到redo log中,此时事务一旦被提交,就将该redolog中的操作,持久化到磁盘上,数据就持久的记录下来了(ACID的D)。

PS:还有,undolog才是原子性的关键。提供redolog,应该主要目的是提升磁盘的IO开销吧,如果直接写入磁盘,IO开销,会很大。如果先将操作记录到redolog中,可以顺序的记录,批量的记录,再一起同步到磁盘上,速度会比直接写磁盘快些。 mysql在生成redolog时,会使用 innodb log buffer,先缓冲到内存中,再同步到redolog上。速度会更快

另外关于,一致性,应该是个整体概念,保证所有的mysql对象(数据,索引,约束,日志,用户)在事务执行前后都具有完整的特性,应该是mysql所有的功能都为此服务吧!
http://www.zhihu.com/question/30272728
分享到:
评论

相关推荐

    数据库事务ACID属性:确保数据一致性的关键

    事务的ACID属性是确保数据库事务正确执行的四个关键特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。本文将详细探讨这四个属性,并展示如何在实际的数据库操作中...

    GoldenDB分布式事务全局一致性.pdf

    总结而言,GoldenDB通过全局事务管理器、数据节点和计算节点的相互配合,实现了分布式事务的原子性、隔离性和备份恢复一致性。这不仅提升了金融业务的稳定性和可靠性,也为银行业务的分布式架构转型升级提供了坚实的...

    数据库事务处理ppt

    数据库事务处理是数据库管理系统中的核心概念,用于确保数据的一致性和完整性。事务是数据库操作的基本单元,它包含一组逻辑操作,这些操作要么全部执行,要么全部不执行,以确保数据的原子性。事务处理主要关注两个...

    GoldenDB事务一致性处理机制.pptx

    GoldenDB 事务一致性处理机制是解决分布式数据库事务处理的关键技术创新,旨在提供高性能、安全可靠的金融级交易型分布式数据库解决方案。该机制通过GoldenDB分布式数据库架构、事务机制和事务处理模块优化实践,...

    数据库同步过程中一致性和完整性的保证

    总结来说,保证数据库同步过程中的一致性和完整性是一项复杂而重要的任务,需要结合事务处理、完整性约束、错误处理和高级工具来实现。理解这些概念和实践方法对于构建高效、可靠的分布式系统是至关重要的。

    数据库事务应用

    ### 数据库事务应用详解 #### 事务处理的重要性与ACID特性 事务处理是现代数据库管理系统(DBMS)中不可或缺的一部分,尤其对于那些涉及复杂业务逻辑、需要确保数据一致性和完整性的应用来说更是如此。事务处理的...

    C#数据库事务原理及实践

    数据库事务是数据库操作的核心概念,尤其在C#编程中,理解并熟练运用数据库事务对于确保数据的完整性和一致性至关重要。数据库事务确保了在多步骤操作中,如果其中一个步骤失败,整个事务可以被回滚,从而避免了数据...

    分布式数据库事务处理(COM+实现)

    分布式数据库事务处理是数据库系统中的一个重要概念,尤其是在大型企业级应用和互联网服务中,它能够保证数据的一致性和完整性,即使在多台计算机之间进行数据操作。COM+(Component Object Model Plus)是微软提出...

    深入理解数据库事务日志:关键作用与应用实践

    数据库事务日志是确保数据库一致性、原子性和持久性的关键技术。通过合理设计和有效管理事务日志,数据库管理员可以提高数据库的可靠性和性能。本文详细介绍了事务日志的概念、作用、实现机制以及在数据库管理中的...

    redis事务与关系型数据库事务比较

    【Redis 事务与关系型数据库事务的比较】 Redis 和关系型数据库(如 MySQL)在事务处理上有显著的差异。在Redis中,事务提供了一种批量执行命令的方式,以确保原子性,但其机制与传统的ACID(原子性、一致性、隔离...

    数据库事务处理基础——设计与实现

    数据库事务是数据库操作的基本单元,它封装了一组操作,这些操作要么全部执行,要么全部不执行,这一原则被称为ACID(原子性、一致性、隔离性和持久性)特性。原子性保证了事务中的所有操作被视为一个单个操作,即使...

    sql数据库事务机制详解

    ### SQL数据库事务机制详解 #### 事务的基本概念 在数据库管理中,事务是一个非常重要的概念。事务是指作为单个逻辑工作单元执行的一系列操作。它主要用于确保数据在更新过程中的完整性,特别是在同步发生的多步...

    数据库基础数据库事务处理.pptx

    一致性是指事务的隔离执行必须保证数据库的一致性,即数据库的完整性限制没有被破坏;事务开始前,数据库处于一致性的状态;事务结束后,数据库必须仍处于一致性状态。隔离性是指系统必须保证事务不受其他并发执行...

    一个简单的方法来实现数据库的事务

    2. **一致性**:事务执行的结果必须使数据库从一个一致性状态转换到另一个一致性状态。 3. **隔离性**:多个并发事务之间的操作是隔离的,每个事务都看不到其他事务未提交的结果。 4. **持久性**:一旦事务完成,其...

    数据库中事务和锁.ppt

    原子性保证事务中的所有操作要么全部完成,要么全部不完成,一致性则保证事务完成后,数据库的状态仍然满足预设的完整性约束,隔离性确保并发执行的事务之间不会相互影响,而持久性则意味着一旦事务提交,其结果就是...

    深入解析数据库事务日志:关键作用与代码实践

    事务日志的存在确保了事务的原子性、一致性、隔离性和持久性(ACID属性),对于数据库的恢复和性能优化至关重要 事务日志是数据库系统中的重要组件,它记录了所有对数据库的更改,保证了事务的原子性和数据库的一致...

    数据库之事务调优

    首先,我们要理解事务的四大特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称ACID属性。原子性确保事务中的所有操作要么全部完成,要么全部不完成;一致性则...

    分布式系统事务一致性解决方案大对比

    ACID特性是传统关系型数据库事务管理的基础,它包括原子性、一致性、隔离性和持久性。这些特性确保了数据库操作的可靠性和数据的正确性,但随着技术的发展,特别是在服务化架构和微服务架构流行开来后,单一的数据库...

    db2数据库事务日志

    通过这种方式,事务日志确保了数据库的数据一致性和事务的ACID属性(原子性、一致性、隔离性、持久性)。 #### 三、事务日志已满的原因分析 当DB2数据库事务日志已满时,通常会遇到SQL0964C错误。导致这一问题的...

Global site tag (gtag.js) - Google Analytics