你的位置:首页 > 数据库

[数据库]数据库知识点②


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排它锁 

两种锁之间的存在矩阵:

 SX
SYesNo
XNoNo

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

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

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

  严格的两段锁协议 Strict 2PL 

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

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