数据库原理

基本内容:ACID与CAP、数据库事务可能引发的问题、数据库锁的类型、三级封锁协议、两段锁协议、数据库隔离级别、MVCC的实现步骤、MySQL事务如何实现、数据库锁如何实现、XA两段提交协议

1.ACID是数据库事务正确执行的四个基本要素:

    原子性:事务是数据库并发控制的最小单位,要么全部提交成功,要么全部回滚失败;

    一致性:事务执行前后,数据的完整性必须保证一致。事务执行前后都保持一致性,数据库总是由一个一致性状态转向另一个一致性状态。

    隔离性:一个事务的修改在最终提交之前,对其它事务是不可见的;

    持久性:事务一旦提交,其所做的修改将永远保存在数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。可以通过数据库备份和恢复来保证持久性。

2.CAP是分布式系统的设计原则。   

    一致性:在一个时刻,各节点数据是否相同。强一致性:数据一致更新,所有的数据变动都是同步的;弱一致性:在限定时间内,最终达到一致。

    可用性:集群对外好的响应性能;有限时间内返回结果。一个结点宕机不影响整体。

    分区容错性:系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,就必须在C和A之间做出选择。

3.并发一致性

    在并发环境下,一个事务如果受到其它事务的影响,那么事务操作就无法满足一致性条件。可能引发的问题有:

   (a)丢失修改。T1和T2两个事务都对一个数据进行修改,T1先修改,T2随后修改,则T2的修改覆盖了T1的修改。

   (b)脏读。T1修改一个数据,T2随后读取这个数据。如果T1撤销了这次修改,那么T2读取的数据是脏数据

   (c)不可重复读。T1读取一个数据,T2对该数据进行了修改。如果T1在读这个数据,此时读取的结果和第一次读取的结果不同。

   (d)幻读(广义的不可重复读)。T1读取某个范围内的数据集,若T2在该范围内插入了一条数据。如果T1再读取该范围的数据,此时读取的结果和第一次读取的结果不同。

    解决方法:

    产生并发不一致性的主要问题是破坏了事务的隔离性,解决方法是通过并发控制(封锁)来保证隔离性。

4.封锁

    (a)锁类型

        排它锁(Exclusive),简称为X锁,又称写锁。一个事务T对数据对象A加了X锁,就可以对A进行读取和更新。加锁期间其它事务不能对A加任何锁。

        共享锁(Shared),简称为S锁,又称读锁。一个事务T对数据对象A加了S锁,就可以对A进行读取操作,但是不能进行更新操作。加锁期间其它事务能对A加S锁,但是不能加X锁。

        更新锁(Updated),简称为U锁。在提交读隔离级别中,此事务读取数据[获取数据对象的读锁(S锁)],然后修改数据 [此操作要求锁转换为排他锁(X 锁)],并发时可能导致死锁。因此引入U锁。

            update test set A=A-1 where id=1;//不恰当的例子 该更新语句分为两步:先读数据对象的值,再设置数据对象的值。

        意向锁(Intention Locks)可以支持多粒度封锁。它本身是一个表锁,表示想对该表的某行记录进行操作,而非整张表。通过原来的X/S锁之上引入了IX/IS,来表示一个事务想要在某个数据行上加X锁或S锁。

    (b)封锁粒度

        锁数据库、表、页、行、属性列。     

    (c)封锁协议

    三级封锁协议:通过加不同类型的锁和不同的释放时机来实现。

        1级封锁协议:事务T要修改数据对象A时必须加X锁,直到事务结束才释放锁。可以有效避免修改丢失问题。

        2级封锁协议:在1级封锁协议的基础上,约定读取A时必须加S锁,读取完马上释放S锁。可以有效避免脏读问题。根据1级封锁协议,若T事物1在对数据对象A进行修改,会加X锁,那么事务T2就无法对A加S锁,也就不会读入脏数据。

        3级封锁协议:在1级封锁协议的基础上,约定读取A时必须加S锁,直至事务结束了才释放S锁。可以有效避免不可重复读问题。因为事务在读A时,其它事务不能加X锁,从而避免了在读期间数据发生改变。

    两段锁协议:事务T对数据对象A进行读或写操作之前,必须先获得对A的封锁;并且在释放一个封锁后,T就不能再获得其它任何锁。“两段”锁顾名思义即把事务分为两个阶段:加锁阶段和释放锁阶段。

    事务遵循两段锁协议是可串行化调度的充分条件。例如以下操作满足两段锁协议,它是可串行化调度的。

lock-x(A)...lock-s(B)...lock-s(c)...unlock(A)...unlock(C)...unlock(B)

    但不是必要条件,例如以下操作不满足两段锁协议,但它还是可串行化调度的。

lock-x(A)...unlock(A)...lock-s(B)...unlock(B)...lock-s(c)...unlock(C)...

    (d)数据库隔离级别(隔离性)

        1.未提交读(READ UNCOMMITTED)

            指定语句可以读取已由其它事务修改但尚未提交的行。事务中的修改,即使没有提交,对其它事务也是可见的。

        2.提交读(READ COMMITTED)

            指定语句不能读取已由其它事务修改但尚未提交的行。这样可以避免脏读。该选项是SQL Server默认隔离级别。一个事务只能读取已经提交事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。

        3.可重复读(REPEATABLE READ)

            指定语句不能读取已由其它事务修改但尚未提交的行,并且指定,其它任何事务都不能在当前事务提交之前修改由当前事务读取的数据。该选项是MySQL默认隔离级别。可以保证在同一个事务中多次读取同样的数据的结果是一样的。不能解决幻读。

        4.可串行化(SERIALIXABLE)

            强制事务串行执行,就不存在并发问题。

        5.多版本并发控制(Multi-Version Concurrency Control,MVCC)/snapshot隔离级别

           思想: copyOnWrite,无锁编程。   适用于读多写少的场景(写时复制)。

        实现原理:默认添加两个隐藏列(数据创建时间事务版本号create_ver,数据删除时间事务版本号expire_ver),通过对两个隐藏列的对比实现。

        (1)select:行创建版本号create_ver<=当前事务版本号current_ver(代表该事务开启之前数据行就存在或者是当前事务新建的数据行)且行删除版本号expire_ver>当前事务版本号current_ver(代表事务开始前该行还没有被删除)。

        (2)update:写时复制机制。将旧行删除时间expire_ver设为当前事务版本号current_ver:expire_ver=current_ver;将新行的创建时间create_ver设置为当前事务版本号create_ver=current_ver;

        (3)delete:将删除时间设为当前事务版本号expire_ver=current_ver;

        (4)insert: 将创建时间设为当前事务版本号expire_ver=current_ver;

MySQL事务的实现:

    通过锁实现隔离性,通过redo log来实现原子性和持久性,通过undo log来实现一致性。

XA两段提交协议:

    两类角色:协调者、参与者。协调者是对集群的事务进行控制,本身不需要执行事务。

    阶段1:事务请求(询问)阶段。1.协调者向所有参与者发送事务内容,并等待各参与者回应是否可以进行事务提交操作;2.各参与者开始执行事务,并将自己的执行情况反馈给协调者,如果可以进行事务提交操作,则返回Yes,否则返回No。

    阶段2:事务提交阶段。如果协调者从所有参与者都获得Yes响应,则对所有参与者发送commit命令;参与者接受到commit命令后执行事务提交操作,在提交事务完成后向释放占用资源并协调者发送ACK消息;协调者接受到所有参与者的ACK后,该事务完成。如果任何一个协调者向参与者发送了No响应,或者在超时时间内协调者没有收到所有参与者的回馈响应,那么会中断事务:协调者向所有参与者发送rollback命令,参与者接收到rollback命令后,开始执行回滚操作,回滚完成后释放等占用资源并向协调者发送ACK消息,协调者接受到所有参与者的ACK后再执行事务中断。

    可以看出这是一个强一致性算法。

    问题:1.事务提交阶段存在同步阻塞,所有参与者等待协调者的commit/rollback命令才能继续执行,极大地限制了分布式系统的性能。2.协调者单点故障,若在第二阶段协调者挂掉而没有发送,没有向参与者发送commit/rollback命名,那么所有参与者将持续等待,无法完完成提交事务;或者只向部分参与者发送了commit就挂掉了,那么将导致数据不一致性,出现数据分区。

参:

MySQL技术内幕

https://www.cnblogs.com/acm-bingzi/p/msqlLimit.html

https://www.cnblogs.com/siqi/p/6690059.html

https://msdn.microsoft.com/zh-cn/library/ms175519(v=sql.105).aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书自1994年初版以来,已成为学习、设计及使用关系数据库人员的一本经典教材。它从理论和实践两方面对数据库设计和编程均做了严谨的表述。其内容包括关系理论、数据库设计、数据库编程及运行-转储结果。每一部分均从基本原理出发,再用实际系统中的实例来说明。   本次修订版反映了6年来数据库领域总体的进步和发展动态,书中重点讲述了对象关系模型;介绍了一些系统(如oracle、db2和informix等)中通用的新概念;对隔离技术作了更新介绍;对运行结果的表述更现代。相对于初始标准来说,sql数据库语言有了非常重要的变化,所以对对象关系给予特别讲述。本书还介绍了sql-99设计方法及与之相关的原理方法及主要产品。本书的作者是在数据库界工作30多年的资深专家,富于教学和实践经验。本书力图在数据库领域各不相同的思想和趋势中找到一个统一的观点提供给读者。   本书对于初接触数据库系统的读者不啻为一本极好的教材;对于那些对数据库领域的发展还未给予足够关注的人是一本易于接受的参考书;同时也是设计人员和编程人员及时更新知识的有用的参考书。   内容: 1. 简介 2. 关系模型 3. 基本sql查询语言 4. 对象关系sql 5. 数据库编程访问 6. 数据库设计 7. 完整性、视图、安全性和目录 8. 索引 9. 查询处理 10. 事务更新 11. 并行与分布式数据库 附录a 介绍性指南 附录b 编程细节 附录c sql语句语言 附录 d 设置查询计数      作者简介:   parick o'neil is a professor of computer science at the uniersity of massachusetts at boston. he is responsible for a number of important results in transactonal performance and disk access algorithms,and he holds patents for his work in these and other database areas.   elizabeth o'neil is a professor of computer science at the university of massachusetts at boston.she serves as a comsult-ant to sybase iqin concor, massachusetts,and has worked with a number of other corporations,includin microsoft adn bolt,beranek,and newman.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值