关键字:ORACLE, SQL SERVER, 锁定, Before Image, ISOLATION LEVEL, NOLOCK, ORA-01555
一、ORACLE 非阻塞查询与Before Image
这里使用的是ORACLE所特有的非阻塞查询技术:Before Image/Rollback Segment/UNDO Tablespace
!长时间运行的查询会遇到的错误情形分析:
二、SQL SERVER的情形
一个用户对表数据进行修改,但尚未提交;另一个用户查询 select count(*) from t 也会被锁定!
这对于一直使用ORACLE,刚接触SQL SERVER的用户,是很难理解的。其根本原因就在于SQL SERVER没有类似 Before Image 的机制。
对此SQL SERVER的解决办法:
(1)使用行级锁。
好像较新版本的SQL SERVER(2000以及后续版本?)会自动使用行级锁。这样,虽然全部查询会被锁定等待,但查询其它行会立即得到结果。
(2)不太严谨的做法是使用 NOLOCK
写法: select ... from ... with(NOLOCK)
效果: 不会被锁定,立即返回结果。
看起来不错,是吗?但是,等等,效果根本不能与ORACLE相比!
NOLOCK等价于 ISOLATION LEVEL READ UNCOMMITED. 这会产生很多问题,必须谨慎使用!
开发SQL SERVER数据库应用的原则:
基于以上分析,原则为:应当尽量写短小的事务处理语句,以免长时间锁定其它事务。
写到这里,似乎明白了SQL SERVER缺省事务行为为何与ORACLE不相同了:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9844649/viewspace-1024767/ ,如需转载,请注明出处,否则将追究法律责任。