• 数据库知识点②


    1.ECA (Event-Condition-Action)

    事件触发规则 trigger [行级或语句级; 几个事件的组合; 触发条件为真]

    2.ACID

    ①Atomicity requirement 原子性要求

    简单地说就是:要么同时拒绝,要么同时成功。

      还是举个实在一点的例子:

      (小菜刚写了转账系统,想在想试试)

      小菜:既然你教给我这么多设计模式,还是要给些钱吧。我有个账户8888*********8888,大鸟你的账户是啥?我给你转钱

      大鸟:那就转这个账户吧 6666*********6666,

      (在转账操作中的小菜)

      小菜:完了,停电了。我刚转出去,你等会上去看看有没有转到。

      (过了一分钟)

      大鸟:没有呀。

      小菜:玩完了。

    根据这个例子抽象出来原子性:一个事务包含多个操作,这些操作要么全部执行,要么全都不执行。实现事务的原子性,要支持回滚操作,在某个操作失败后,回滚到事务执行之前的状态。

    ②Consistency requirement 一致性需求

    一致性,即在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。(完整性规则、参照完整性规则、自定义完整性规则[Check约束或者trigger触发器])

    ③Isolation requirement 隔离性要求

    举个常见的例子

    在Windows中,如果多个进程对同一个文件进行修改是不允许的,Windows通过这种方式来保证不同进程的隔离性:

     而SQL Server中,通过SQL SERVER对数据库文件进行管理,从而可以让多个进程可以同时访问数据库,为此SQL Server为了解决线程之间的冲突,设置了锁协议。

    ④Durability requirement 持久性要求

      持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。即一旦一个事务提交,DBMS(Database Management System)保证它对数据库中数据的改变应该是永久性的,持久性通过数据库备份和恢复来保证。

      意味着在事务完成之后,该事务对数据库所做的更改便持久的保存在数据库之中,并不会被回滚。

      数据库实现持久性的原理:SQL server 通过 write-ahead-transaction-log 来保证数据的持久性。write-ahead-transaction-log的意思是:事务中对数据库的改变在写入数据库之前,首先写入到事务日志中。而事务日志是按照顺序号进行排序的(LSN),当数据库崩溃或者服务器断电时,重新启动SQL Server,SQL Server 首先会检查日志顺序号,将本应对数据库做更改而未做的部分持久化到数据库中,从而保证了持久性。

     ⑤SQL Server通过利用加锁和阻塞来保证事物之间不同等级的隔离性

      事务之间的互相影响可分为:脏读(Dirty Read)、不可重复读(no-repeated Read)、幻读(Phantom Read)

    1.脏读:

      一个事务读取到了另一个事务未提交的数据,而这个数据有可能是在之后会被回滚的。

    举个例子:

    甲将A账户的钱转到B账户,同时乙在此时对B账户余额进行查询。

    从A账户取出$1000

    转给B账户

     
      读取余额,发现甲已经向自己转账

    甲发现转的金额有错,

    便执行了回滚,取消了

    之前的操作

     

     2.不可重复读:

      在数据库访问中,一个事务范围内的两个相同查询却返回了不同数据,这是由于查询时系统中其他事务修改的提交而引起的。

    举个例子:

    甲和乙同时对A账户进行操作。

    读取账户余额  
      读取账户余额
    存入$1000  
      读取账户余额

    前后两次乙的读取操作得到的账户余额不相同,只就叫做不可重复读。(因为乙重复读了账户余额,发现了不同,可能是这样才叫做不可重复读吧)

    3.幻读(Phantom Read)

    指事务不是独立执行时发生的一种现象,例如第一个事务删除某一行全部数据,第二个事务添加了一行新数据,好像没有修改一样,出现了幻读。

    ⑥理解SQL Server中的隔离等级

      为了避免几个事务之间的影响,SQL Server通过设置不同的隔离等级来进行不同的避免,因为高的隔离等级意味着更多的锁,从而牺牲性能。

      SQL Server提供了5中隔离,隔离等级由低到高分别为:

    Read Uncommited(最高性能,但可能出现脏读,不可重复读,幻读)

    Read Commited (符合99%实际需求,可能出现不可重复读,幻读)

    Repeatable Read(可能出现幻读)

    Serializable (最低性能,Range锁会导致并发下降)

    SNOPSHOT(SQL Server中不涉及到的,并不常用)

    ⑦好的调度:

    1.ACID的可串行化

    2.可恢复的调度

    3.无级联的回滚

    ⑧并发控制:增加合理的等待

    1.Locking:为事务加上锁,

      锁的协议,什么时候加,什么时候释放,遇到锁什么反应

    2.Time-Stamping

    3.Optimistic 积极考虑

     假设施加在数据库上的操作大多数并不冲突

    Shared locks共享锁 AND Exclusive locks排它锁 

    两种锁之间的存在矩阵:

      S X
    S Yes No
    X No No

    ⑩锁协议:两段锁协议 Two-Phase-locking

    1.锁定阶段(Growing Phase):把所有要锁定的数据全部加锁,

    2.释放阶段(Shrinking):当开始释放锁时,不能再加上其他的锁,只能不断将之前加上的锁解开。

      严格的两段锁协议 Strict 2PL 

    1.所有的事务,其所拥有的全部锁只能在所有事务执行完时,才能进行释放(commit/rollback操作之后)

    2.其余要求和两段锁协议要求相同

    上一篇数据库知识点①:http://www.cnblogs.com/zpfbuaa/p/5358035.html

    下一篇数据库知识点③:http://www.cnblogs.com/zpfbuaa/p/5503200.html

  • 相关阅读:
    简单例子windows 共享内存 Demo -----(一)
    Qt qss浅析
    基于EntityFramework的权限的配置和验证
    快速获取Windows系统上的国家和地区信息
    Scorm 1.2 开发文档
    SQL Server 联表字段合并查询
    解决 ko mapping 数组无法添加新对象的问题
    SQL Server 数据库初始化准备脚本
    妾心如水,良人不来
    有趣的格子效果
  • 原文地址:https://www.cnblogs.com/zpfbuaa/p/5479733.html
Copyright © 2020-2023  润新知