事备与隔离性级别

事备与隔离性级别
----------
事务的四个属性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。
1 .原子性 (Atomic)
最重要的原则,也是最容易理解的原则。被事务管理的所有方法,要么一起被提交,要么一起回滚。
2. 一致性 (Consistency)
事务在系统完整性中实施一致性,如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于新有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。
3. 隔离性 (Isolation)
在隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。
4. 持久性 (Durability)
持久性意味着一旦事务执行成功,在系统中产生的所有变化将是永久的。

数据库锁概念:
在数据库中有两种基本的锁类型: 排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。
当事务希望写(修改)某数据项,而且目前在此数据项上没有被其他事务加锁时,使用排他锁。如果事务T2修改数据项A,则事务T2需要在数据项A上加一个排他锁。当且仅当在数据项上没有任何其他锁时才可以加排他锁。
当并发事务需要读数据时存在一个共享锁。当并发事务都是只读取数据时,共享锁不产生冲突。当事务希望从数据库中读取数据并且在此数据上没有排他锁时,使用共享锁。共享锁允许若干个READ事务并行地读取相同的数据项,例如,如果事务T1在数据项A上有共享锁,而事务T2也希望读取数据项A,则事务T2在数据项A上也可以获得一个共享锁。注意:排他锁是在commit或rollback命令结束事务之后,锁定才会被解除。


事务隔离级别
一个事务必须与其它事务进行隔离的程度。较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。
  
数据库并发操作存在的异常情况:
1.   更新丢失 (Lost update):两个事务都同时更新一行数据但是第二个事务却中途失败退出导致对数据两个修改都失效了,这是 系统没有执行任何锁操作 因此并发事务并没有被隔离开来。
2. 脏读取 (Dirty Reads):一个事务开始读取了某行数据但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险很可能所有操作都被回滚。
3. 不可重复读取 (Non-repeatable Reads):一个事务对同一行数据重复读取两次但是却得到了不同结果。例如在两次读取中途有另外一个事务对该行数据进行了修改并提交。
4. 两次更新问题 (Second lost updates problem):不可重复读取特例,有两个并发事务同时读取同一行数据然后其中一个对它进行修改提交而另一个也进行了修改提交这就会造成第一次写操作失效。
5. 幻读 (Phantom Reads):也称为幻像(幻影)。事务在操作过程中进行两次查询,第二次查询结果包含了第一次查询中未出现的数据(这里并不要求两次查询SQL语句相同)这是因为在两次查询过程中有另外一个事务插入数据造成的。 
      
事务隔离级别
1. 未授权读取 (Read Uncommitted): 也称未提交读。允许脏读取但不允许更新丢失 ,如果一个事务已经开始写数据而这个数据则不允许同时进行写操作但允许其他事务读此行数据。 该隔离级别可以通过“排他写锁”实现 。它允许读取已经被其它用户修改但尚未提交确定的数据。
2. 授权读取 (Read Committed): 也称提交读。允许不可重复读取但不允许脏读取 。这可以通过“瞬间共享读锁”和“排他写锁”实现,读取数据的事务允许其他事务继续访问该行数据,但是未提交写事务将会禁止其他事务访问该行。SQL Server 默认的级别。 在此隔离级下,SELECT 命令不会返回尚未提交(Committed) 的数据,也不能返回脏数据 。
3. 可重复读取 (Repeatable Read): 禁止不可重复读取和脏读取。但是有时可能出现幻影数据 , 这可以通过“共享读锁”和 “排他写锁”实现 , 读取数据事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务 。在此隔离级下,用SELECT 命令读取的数据在整个命令执行过程中不会被更改。此选项会影响系统的效能,非必要情况最好不用此隔离级。

4. 串行 (Serializable): 也称可串行读。提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行, 但不能并发执行 。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作事务访问到。事务隔离的最高级别,事务之间完全隔离。如果事务在可串行读隔离级别上运行,则可以保证任何并发重叠事务均是串行的。 

隔离级别

 
更新丢失 
脏读取 
重复读取
幻读
未授权读取
N
Y
Y
Y
授权读取 
N
N
Y
Y
可重复读取
N
N
N
Y
串行 
N
N
N
N
     

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值