﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-城市中的一条鱼-文章分类-技术点滴</title><link>http://www.blogjava.net/narry/category/36241.html</link><description>雪化了，就是春天</description><language>zh-cn</language><lastBuildDate>Thu, 02 Dec 2010 19:20:53 GMT</lastBuildDate><pubDate>Thu, 02 Dec 2010 19:20:53 GMT</pubDate><ttl>60</ttl><item><title>有关数据库的事务</title><link>http://www.blogjava.net/narry/articles/242644.html</link><dc:creator>narry</dc:creator><author>narry</author><pubDate>Tue, 25 Nov 2008 13:37:00 GMT</pubDate><guid>http://www.blogjava.net/narry/articles/242644.html</guid><wfw:comment>http://www.blogjava.net/narry/comments/242644.html</wfw:comment><comments>http://www.blogjava.net/narry/articles/242644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/narry/comments/commentRss/242644.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/narry/services/trackbacks/242644.html</trackback:ping><description><![CDATA[<p>摘抄自：http://www.cnblogs.com/wzcheng/archive/2006/10/18/532243.html</p>
<p>设置事务的级别 SET TRANSACTION ISOLATION LEVEL<br />
A、READ COMMITTED ：指定在读取数据时控制共享锁以避免脏读，但数据可在事务结束前更改，从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。<br />
B、READ UNCOMMITTED：执行脏读或 0 级隔离锁定，这表示不发出共享锁，也不接受排它锁。当设置该选项时，可以对数据执行未提交读或脏读；在事务结束前可以更改数据内的数值，行也可以出现在数据集中或从数据集消失。这是四个隔离级别中限制最小的级别。<br />
C、REPEATABLE READ：锁定查询中使用的所有数据以防止其他用户更新数据，但是其他用户可以将新的幻像行插入数据集，且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别，所以应只在必要时才使用该选项。<br />
D、SERIALIZABLE：在数据集上放置一个范围锁，以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低，所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。<br />
注释<br />
一次只能设置这些选项中的一个，而且设置的选项将一直对那个连接保持有效，直到显式更改该选项为止。这是默认行为，除非在语句的 FROM 子句中在表级上指定优化选项。<br />
SET TRANSACTION ISOLATION LEVEL 的设置是在执行或运行时设置，而不是在分析时设置。<br />
<br />
<span style="color: #0000ff">术语解释：</span><br />
<br />
在一个程序中，依据事务的隔离级别将会有三种情况发生。<br />
　　<br />
　　◆脏读：一个事务会读进还没有被另一个事务提交的数据，所以你会看到一些最后被另一个事务回滚掉的数据。<br />
<br />
　　◆ 读值不可复现：一个事务读进一条记录，另一个事务更改了这条记录并提交完毕，这时候第一个事务再次读这条记录时，它已经改变了。<br />
<br />
　　◆ 幻影读：一个事务用Where子句来检索一个表的数据，另一个事务插入一条新的记录，并且符合Where条件，这样，第一个事务用同一个where条件来检索数据后，就会多出一条记录。<br />
<br />
（以上文章摘自网络）<br />
</p>
<p><span style="color: #800000">结合以上的理论知识，将<span class="identifier"><font color="#000000">IsolationLevel</font></span>枚举的各值解释如下：<br />
<br />
</span>ReadCommitted： <br />
假设A事务对正在读取数据Data放置了共享锁，那么Data不能被其它事务改写，所以当B事务对Data进行读取时总和A读取的Data数据是一致的，所以避免了脏读。由于在A没有提交之前可以对Data进行改写，那么B读取到的某个值可能会在其读取后被A更改从而导致了该值不能被重复取得；或者当B再次用相同的where字句时得到了和前一次不一样数据的结果集，也就是幻像数据。</p>
<p>ReadUncommitted：<br />
假设A事务即不发布共享锁，也不接受独占锁，那么并发的B或者其它事务可以改写A事务读取的数据，那么并发的C事务读取到的数据的状态和A的或者B的数据都可能不一致，那么。脏读、不可重复读、幻象数据都可能存在。</p>
<p>RepeatableRead：<br />
（注意MSDN原文中的第一句话：在<strong style="color: #333399">查询</strong>中使用的所有数据上放置锁，所以不存在脏读的情况）。<br />
假设A事务对读取的所有数据Data放置了锁，以阻止其它事务对Data的更改，在A没有提交之前，新的并发事务读取到的数据如果存在于Data中，那么该数据的状态和A事务中的数据是一致的，从而避免了不可重复的读取。但在A事务没有结束之前，B事务可以插入新记录到Data所在的表中，那么其它事务再次用相同的where字句查询时，得到的结果数可能上一次的不一致，也就是幻像数据。<br />
<br />
Serializable：<br />
&nbsp;在数据表上放置了排他锁，以防止在事务完成之前由其他用户更新行或向数据集中插入行，这是最严格的锁。它防止了脏读、不可重复读取和幻象数据。<br />
<br />
以下是对照表：<br />
<br />
</p>
<div class="TABLE">
<table class="CALSTABLE" border="1">
    <colgroup>
    <col>
    <col>
    <col>
    <col>
    <thead>
        <tr>
            <th>隔离级别 </th>
            <th>脏读（Dirty Read） </th>
            <th>不可重复读（NonRepeatable Read） </th>
            <th>幻读（Phantom Read） </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>读未提交（Read uncommitted） </td>
            <td>可能 </td>
            <td>可能 </td>
            <td>可能 </td>
        </tr>
        <tr>
            <td>读已提交（Read committed） </td>
            <td>不可能 </td>
            <td>可能 </td>
            <td>可能 </td>
        </tr>
        <tr>
            <td>可重复读（Repeatable read） </td>
            <td>不可能 </td>
            <td>不可能 </td>
            <td>可能 </td>
        </tr>
        <tr>
            <td>可串行化（Serializable ） </td>
            <td>不可能 </td>
            <td>不可能 </td>
            <td>不可能 </td>
        </tr>
    </tbody>
</table>
</div>
 <img src ="http://www.blogjava.net/narry/aggbug/242644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/narry/" target="_blank">narry</a> 2008-11-25 21:37 <a href="http://www.blogjava.net/narry/articles/242644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>