Microsoft SQL server 2008技术内幕, T-SQL查询
不错的序言语录:
使用ORM映射工具是要付出一定的代价的.
在把计算工作交给数据库服务器处理的同时,也能够减少为传输数据而花费的网络流量,提高应用程序的整体性能.
写好SQL,需要我们用一种不同的思维方式来处理问题,这是一种面向声明和集合的思维方式,而不是面向过程的,这就是两种思维方式的分化.
SQL用的好,写出来的代码会有10倍的有效,而且更具有伸缩性和可维护性.
来自于"事务和并发.事务"
常见问题点:
1) SQL server如何处理对于同一个数据的并发使用(concurrency)的问题?
2) SQL server如何使用所来隔离不一致的数据?
3) SQL server如何解决阻塞状态?
4) 在不同的隔离级别下,SQL server如何控制数据一致性的级别?
5) 如何避免或者减少死锁的发生?
在Sql server中,与Oracle不太一样的事情是,如果在implicit transactions会话选项为默认OFF的时候,必须要自己来声明开始一个事务和提交或者回滚一个事务.
begin tran;
insert into foo values('1','jason');
commit/rollback tran;
试题点:事务的四个属性ACID. 原子性,一致性,隔离性,持久性.
有关于持久性方面,与Oracle有一致的操作,当数据库重启或者启动的时候,会去检查日志里面的相关操作,如果该日志已经被提交,但是尚未写入数据库的话,就会写入数据库,在SQL server的恢复处理一般包括两个阶段,重做阶段和撤销阶段.redo and undo.重做阶段,对于提交指令已经写入日志,但是数据修改还没有应用到数据分区的事务,数据库引擎会重做replaying这些事务所做的修改,也叫做前滚 rolling forward.在撤销阶段,对于提交指令还灭有记录到日志中的事务,数据库引擎会撤销这些事务所做的修改,这个过程也叫做回滚 rolling back.
试题点:在Sql server中,如何判断当前的操作在一个事务当中呢?
通过读取@@trancount变量,如果这个变量返回的是一个大于零的值,那么说明当前处于一个事务里面,如果这个变量返回的是一个等于零的值,那么就说明当前没有处于一个事务里面.
begin tran;
insert into foo values(1,1);
print @@trancount;
commit tran;
几行语句的作用:
set @orderId = scope_identity();
dbcc checkident('sales.orders',reseed,110077);