sqlserver 中的事务
数据库已经使用两年多了,今天刚刚把事务的隔离级别搞清楚真是有点说不过去,今天把体会写在这里: ? ? 说到事务的隔离级别先说一下事务在并行运行中会遇到的个问题 ? ? 1.脏读(dirty reads) 一个事务读取了另一个未提交的并行事务写的数据。 ? 2.不可重复读(non-repeatable reads)一个事务重新读取前面读取过的数据, 发现该数据已经被另一个已提交的事务修改过。 ? 3.幻读(phantom read)一个事务重新执行一个查询,返回一套符合查询条件的行, 发现这些行因为其他最近提交的事务而发生了改变。 ? ? 关于脏读这个非常好理解,就是事务A在读取数据的时候读取到了其它事修改了但还没有提交的数据,未提交的数据有可能被回滚所以称之为脏数据,这也是脏读的由来吧(大概) ? ? 关于不可重复读? ? 举个例子--如果事务A有两个阶段 ????? 1 select XXX from table where id = 1?;? ???? ?2. select XXX from table where id = 1 ; ? 上面的两条语句在同一个事务中。按理说应该返回的数据应该一样, ?但是在事务A执行到阶段1后,阶段2之前? ,如果有另一个事务修改了 id 等于1的这条数据并且已经提交了。就会造成 两个阶段查询产生的数据不一样。不可重复读就是一个事务中两次同样的语句中出现了不同的结果 ? ??? 关于幻读 ????? 同样一个事务A有两个阶段 ????? 1. select XXX from table where id between 1 and 10 ??????1. select XXX from table where id between 1 and 10 同样上面的两个语句 在执行到1后2前时候,其它的事务 删除了或增加了 id在1至10内的记录 那么两个阶段产生的查询结果是不同的 ? ?
隔离级别 |
脏读(Dirty Read) |
不可重复读(NonRepeatable Read) |
幻读(Phantom Read) |
|