微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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)
读未提交(Read uncommitted) 可能 可能 可能
读已提交(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
可串行化(Serializable ) 不可能 不可能 不可能
上表为引用

 

所谓的事务隔离级别其实就是 改变了其它事务在执行过程中对自己的事务的影响方式。同时也改变了自己事务对其它事务的影响方式

如果把自己事务隔离级别改为读未提交。则在自己事务的执行过程中能过读取其它任何事务未提交数据(不管其它事务的隔离级别)

读已提交则相反只能读其它事务已经提交的事务

如果把自己的事务设置为可重复读则在自己的事务未结束之前,其它的事务可以查询但不能更改被自己事务锁定(应该是共享锁)的记录

 

可串行化其实就是在一个 where  语句所能影响的行记录上加上共享锁

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐