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.事务的隔离设置只是针对当先的会话,不是全局变量
![](http://images2015.cnblogs.com/blog/511074/201509/511074-20150920160215101-1747875563.png)
1.READ UNCOMMITTED(最低级,没有任何隔离,结果可能出现脏读,但是读取速度快,并发性能高)
”脏读“[b]一个事务正在更改,另个事务真尝试读取,结果读取到未提交的数据[/b]
具体实例(如图)
![](http://images2015.cnblogs.com/blog/511074/201509/511074-20150920162710304-137702701.png)
解决方案:
[b][b]2.READ UNCOMMITTED[/b][/b]
这个级别,专门又来防止出现“脏读”的情况!(如图)
![](http://images2015.cnblogs.com/blog/511074/201509/511074-20150920163230023-482622390.png)
”不可重复读“一个事务正在进行两次读取同一条数据,另一个事务进行修改同一条数据,结果出现,两次读取的结果不一致!
具体如图:
![](http://images2015.cnblogs.com/blog/511074/201509/511074-20150920170123273-2136953691.png)
解决方案
3.REPEATABLE READ
当一个事务正在读取数据时,阻止其他事务进行修改,直到读取事务结束。使得同一事务中两次读取的数据一致!
如图:
![](http://images2015.cnblogs.com/blog/511074/201509/511074-20150920171206539-194420245.png)
幻读:一个事务正在进行两次读取,另一个事务进行删除或增加,结果出现,两次读取的结果(数量)不一致!
如图:
![](http://images2015.cnblogs.com/blog/511074/201509/511074-20150920172830008-1409652135.png)
解决方案:将事务隔离级别提高到 snapshot
[b]4.SNAPSHOT[/b]
具体如图:
![](http://images2015.cnblogs.com/blog/511074/201509/511074-20150921095057115-1859861608.png)
接下来,我们来解释这个snapshot 隔离
也许你已经注意到,在上述例只中,防止并发性问题的同时也降低了数据的可访问性。先是不允许Read,然后是不允许Update,不允许Insert。SNAPSHOT事务隔离级别防止了之前那些隔离级别所能防止的许多并发性问题,同时降低了与之相关的成本。它允许更高的数据可用性。
通过在事务开始前在tempbd中使用row version创建一份数据库快照,snapshot事务隔离级别完成了此操作。
使用后,事务仅能够看到快照中的数据,其他事务任然能访问同一数据只要它们不去修改已经被第一个事务修改过的数据就好。如果那样做了(企图修改数据),那么,那些事务将会被回滚并以错误消息终止。
5.SERILIZABLE
可序列化是事务隔离级别中最高的级别,为最严谨的隔离级别,当一个事务正在读取时(未提交),另外一个事务时不允许
update insert delete 操作额的呀;
![](http://images2015.cnblogs.com/blog/511074/201509/511074-20150921101339162-1461898085.png)
提到事务个隔离级别问题,不等不涉及到死锁和并发性的问题,
我们将在文章
sqlserver 死锁和并发性问题
中来讨论此问题
基本语法格式:
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.事务的隔离设置只是针对当先的会话,不是全局变量
![](http://images2015.cnblogs.com/blog/511074/201509/511074-20150920160215101-1747875563.png)
1.READ UNCOMMITTED(最低级,没有任何隔离,结果可能出现脏读,但是读取速度快,并发性能高)
”脏读“[b]一个事务正在更改,另个事务真尝试读取,结果读取到未提交的数据[/b]
具体实例(如图)
![](http://images2015.cnblogs.com/blog/511074/201509/511074-20150920162710304-137702701.png)
解决方案:
[b][b]2.READ UNCOMMITTED[/b][/b]
这个级别,专门又来防止出现“脏读”的情况!(如图)
![](http://images2015.cnblogs.com/blog/511074/201509/511074-20150920163230023-482622390.png)
”不可重复读“一个事务正在进行两次读取同一条数据,另一个事务进行修改同一条数据,结果出现,两次读取的结果不一致!
具体如图:
![](http://images2015.cnblogs.com/blog/511074/201509/511074-20150920170123273-2136953691.png)
解决方案
3.REPEATABLE READ
当一个事务正在读取数据时,阻止其他事务进行修改,直到读取事务结束。使得同一事务中两次读取的数据一致!
如图:
![](http://images2015.cnblogs.com/blog/511074/201509/511074-20150920171206539-194420245.png)
幻读:一个事务正在进行两次读取,另一个事务进行删除或增加,结果出现,两次读取的结果(数量)不一致!
如图:
![](http://images2015.cnblogs.com/blog/511074/201509/511074-20150920172830008-1409652135.png)
解决方案:将事务隔离级别提高到 snapshot
[b]4.SNAPSHOT[/b]
具体如图:
![](http://images2015.cnblogs.com/blog/511074/201509/511074-20150921095057115-1859861608.png)
接下来,我们来解释这个snapshot 隔离
也许你已经注意到,在上述例只中,防止并发性问题的同时也降低了数据的可访问性。先是不允许Read,然后是不允许Update,不允许Insert。SNAPSHOT事务隔离级别防止了之前那些隔离级别所能防止的许多并发性问题,同时降低了与之相关的成本。它允许更高的数据可用性。
通过在事务开始前在tempbd中使用row version创建一份数据库快照,snapshot事务隔离级别完成了此操作。
使用后,事务仅能够看到快照中的数据,其他事务任然能访问同一数据只要它们不去修改已经被第一个事务修改过的数据就好。如果那样做了(企图修改数据),那么,那些事务将会被回滚并以错误消息终止。
5.SERILIZABLE
可序列化是事务隔离级别中最高的级别,为最严谨的隔离级别,当一个事务正在读取时(未提交),另外一个事务时不允许
update insert delete 操作额的呀;
![](http://images2015.cnblogs.com/blog/511074/201509/511074-20150921101339162-1461898085.png)
提到事务个隔离级别问题,不等不涉及到死锁和并发性的问题,
我们将在文章
sqlserver 死锁和并发性问题
中来讨论此问题
相关文章推荐
- Redis Error
- Oracle 11g Dataguard参数详解
- DB2数据库全系列版本安装介质下载地址
- mysql 修改root密码
- VB.NET读写MongoDB
- MySQL Study之--MySQL innodb存储与索引的总结
- hibernate4操作数据库blob案例
- Mac下通过Homebrew安装配置MySQL
- 运维进行时-修改数据库密码
- Ubuntu下mysql安装,登录
- Express调用mssql驱动公共类dbHelper
- mysql事件调度器
- NoSQL数据库:Redis适用场景及产品定位
- SQL Server 三大物理连接算法(嵌套,合并,哈希)的IO成本总结
- SQL Server中行列转换 Pivot UnPivot
- mysql 主从复制读写分离
- MySQL添加索引
- mysql备份
- SQL字符串操作汇总
- jdbc操作数据库blob