您的位置:首页 > 数据库

SQL中的事务隔离级别

2015-09-17 12:07 281 查看
sql中事务隔离级别

基本语法格式:

SET TRANSACTION ISOLATION LEVEL

{READ UNCOMMITTED

READ COMMITTED

REPEATABLE READ

SNAPSHOT

SERIALIZABLE

}

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

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

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

1.脏读

2.不可重复读

3.幻读


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

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

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

[b]首先你要明白:[/b]

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

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





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

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

具体实例(如图)



解决方案:

[b][b]2.READ UNCOMMITTED[/b][/b]

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





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

具体如图:



解决方案

3.REPEATABLE READ

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

如图:



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

如图:





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

[b]4.SNAPSHOT[/b]

具体如图:



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

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

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

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

5.SERILIZABLE

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

update insert delete 操作额的呀;





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

我们将在文章

sqlserver 死锁和并发性问题

中来讨论此问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: