SQL中的事务隔离级别

sql中事务隔离级别

基本语法格式:

                   SET TRANSACTION ISOLATION LEVEL

                    {READ UNCOMMITTED

                      READ COMMITTED

                      REPEATABLE READ

                      SNAPSHOT

                      SERIALIZABLE

                     }

接下来,我们一一的解释每个级别。(PS:SQLSERVER 中默认的隔离级别是 READ COMMITED,可以通过DBCC Useroptions 来查看)

往下他们的级别也是一个比一个高

还有几种数据读取错误的概念;

1.脏读

2.不可重复读

3.幻读

将这个之前我们还是先回顾一个事务相关的概念吧;

事务的三个特性:一致性,独立性,持久性。

事务的分类:自动提交事务,显式事务,隐式事务,批处理级事务。

 

首先你要明白:

1.select insert update 语句本身就是事务

2.事务的隔离设置只是针对当先的会话,不是全局变量

 1.READ UNCOMMITTED(最低级,没有任何隔离,结果可能出现脏读,但是读取速度快,并发性能高)

”脏读“一个事务正在更改,另个事务真尝试读取,结果读取到未提交的数据

 具体实例(如图)

 解决方案:

2.READ UNCOMMITTED

这个级别,专门又来防止出现“脏读”的情况!(如图)

 

 

”不可重复读“一个事务正在进行两次读取同一条数据,另一个事务进行修改同一条数据,结果出现,两次读取的结果不一致!

具体如图:

解决方案

3.REPEATABLE READ

当一个事务正在读取数据时,阻止其他事务进行修改,直到读取事务结束。使得同一事务中两次读取的数据一致!

如图:

 

 

幻读:一个事务正在进行两次读取,另一个事务进行删除或增加,结果出现,两次读取的结果(数量)不一致!

如图:

解决方案:将事务隔离级别提高到 snapshot

4.SNAPSHOT

具体如图:

 

接下来,我们来解释这个snapshot 隔离

 也许你已经注意到,在上述例只中,防止并发性问题的同时也降低了数据的可访问性。先是不允许Read,然后是不允许Update,不允许Insert。SNAPSHOT事务隔离级别防止了之前那些隔离级别所能防止的许多并发性问题,同时降低了与之相关的成本。它允许更高的数据可用性。

 通过在事务开始前在tempbd中使用row version创建一份数据库快照,snapshot事务隔离级别完成了此操作。

使用后,事务仅能够看到快照中的数据,其他事务任然能访问同一数据只要它们不去修改已经被第一个事务修改过的数据就好。如果那样做了(企图修改数据),那么,那些事务将会被回滚并以错误消息终止。

 

5.SERILIZABLE

可序列化是事务隔离级别中最高的级别,为最严谨的隔离级别,当一个事务正在读取时(未提交),另外一个事务时不允许

update insert delete 操作额的呀;

 

提到事务个隔离级别问题,不等不涉及到死锁和并发性的问题,

我们将在文章

sqlserver 死锁和并发性问题

中来讨论此问题 

 

这里补充一点关于锁的知识;

关于

如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为独占锁(X锁)。

共享模式到独占锁的转换必须等待一段时间,因为一个事务的独占锁与其他事务的共享模式锁不兼容;发生锁等待。

第二个事务试图获取独占锁(X锁)以进行更新。

由于两个事务都要转换为独占锁(X锁),并且每个事务都等待另一个事务释放共享模式锁,

因此发生死锁。

若要避免这种潜在的死锁问题,请使用更新锁(U锁)。一次只有一个事务可以获得资源的更新锁(U锁)。如果事务修改资源,则更新锁(U锁)转换为独占锁(X锁)。

                                                                      一次只有一个事务可以获得资源的更新锁(U锁)。如果事务修改资源,则更新锁装换成我们的独占所;

ps:更新新锁只与共享锁以及意向共享锁相兼容。

 

posted @ 2015-09-17 12:07  咕-咚  阅读(878)  评论(0编辑  收藏  举报