摘要:在之前的一片随笔中,简单的说了一下SQL Server中的隔离级别。而SQL Server的隔离级别是通过锁的机制来实现的。现在深入一下,谈谈SQL Server中的锁。开始之前,先要定义一下前提:1.隔离级别的实现其实就是在不同的资源上加锁。2.对数据库的每一次访问(CRUD)我们称其为一个事务(...
阅读全文
摘要:在Sql Server中不常用的表运算符之APPLY(1)中提到,SQL2005中新支持的APPLY的特性:1.可以直接将表表达式(表值函数或者子查询)作为APPLY语句的右表连接左表。2.由于使用APPLY是总是先计算左表达式表,所以右表表达式可以使用左表表达式中的列。3.APPLY主要用于将表值函数运用在右表表达式中表的每一行。有时也APPLY将一个子查询作为左表表达式。假设我们有以下的两张表order:customer:选出customer C001最近的N个订单可以使用inner joinSELECT TOP (N) CustomName,OrderId,CreateTime F...
阅读全文
摘要:写在这个系列的前面:就像他们的名字一样,作为一个表运算,他们用来运算左表和右表。JOIN也是一个表运算符,不过他太常用了。APPLY:将右表表达式应用在左表的每一行上。APPLY是Sql2005对SQL语句的拓展,这意味着其他类型的数据库可能不支持这个表运算符。微软设计APPLY的初衷在于将表值函数运用在左表的每一行,并将结果与对应行关联起来。网上大多数文章中提到的也是这样的用法,例如我们有一个Split(s,splitChar)表值函数,可以将一个字符串s用splitChar分割,返回分割后的表。现在有这样一张表:dbo.ApplyCase1sswer,23,wer,234wer,wer,2
阅读全文
摘要:Sql Server2005之后,引入了一个新的隔离级别Snapshot(Read Committed Snapshot Isolation (RCSI))和(Snapshot Isolation (SI))在之前的Sql Server隔离级别(1)中提到的四种隔离级别,除了Read Uncommitted之外,其他的三个隔离级别都会阻塞其他事务的执行(写锁会阻塞读锁,读锁也会阻塞写锁)。这样带来的问题是启用这三个隔离级别将会造成性能的损失和并发量的下降,为了提供更好的并发量并且保持一定的数据一致性,Snapshot应运而生。如果启用了Snapshot隔离,数据库会为提交的数据建立一个版本信息
阅读全文
摘要:数据库是一个并发操作的环境,就像多线程一样,这样在高并发的情况下回出现一些问题。假设我们有一张表Account,表结构和数据如下所示AccountNameBalancejo100fo200假设我们有两个事事务(T1,T2)脏读:当一个事务允许读取另外一个事务修改但未提交的数据时,就可能发生脏读(dirty reads)。(1)T1更新jo的余额:UPDATE Account SET Balance=500 WHERE AccountName='jo'(2)T2选出jo的余额:SELECT Balance FROM Account WHERE AccountName='j
阅读全文