db2/mssql实际上更要命的是其加锁机制的问题
比如mssql 下 表t有 id字段记录唯一
select * from t where id=1 会被update t set where id=2阻塞
而id上有唯一键索引字段时就不会被阻塞
这就是说mssql在执行计划的table scan阶段就要对表进行加锁,而实际上从事实上来看,这是不需要的,如果能将加锁的阶段推后到filter之后的结果集,那么sql1就不会被sql2阻塞了
目前的情况就是db2以及mssql锁的范围与sql真正要锁定的结果无关反而与sql执行计划有非常大的关系。因此锁等待的程度与系统中表及索引对象的设计/sql及其执行计划的优化程度有很大的关系,因此也就与系统开发设计以及维护人员的能力有了很大的关系
达梦也是如此
db2/mssql实际上更要命的是其加锁机制的问题
比如mssql 下 表t有 id字段记录唯一
select * from t where id=1 会被update t set where id=2阻塞
而id上有唯一键索引字段时就不会被阻塞
这就是说mssql在执行计划的table scan阶段就要对表进行加锁,而实际上从事实上来看,这是不需要的,如果能将加锁的阶段推后到filter之后的结果集,那么sql1就不会被sql2阻塞了
目前的情况就是db2以及mssql锁的范围与sql真正要锁定的结果无关反而与sql执行计划有非常大的关系。因此锁等待的程度与系统中表及索引对象的设计/sql及其执行计划的优化程度有很大的关系,因此也就与系统开发设计以及维护人员的能力有了很大的关系
达梦也是如此
麻烦你更新一下你的知识,数据库都在进步。sql server 有snapshot模式,DB2 9.7有当前已落实在CS隔离级别的缺省行为,IDS有use_lastcommit选项。
而且你所谓的不阻塞的结果,并不是MVCC的充要条件。MVCC是写不抑制读的充分条件,而且是一个开销过大的条件。MVCC的存在有可能导致snapshot too old的错误,这个你是否研究过?MVCC导致维护机制非常复杂,这点毋庸置疑吧。要不干嘛Oracle自己的Timesten不支持MVCC?
采用2VCC的DB2/INFORMIX/TIMESTEN都能做到写不抑制读。说到底,我怀疑你没弄清楚到底什么是MVCC,也没弄清楚他和write do not block read之间的关系。
麻烦你更新一下你的知识,数据库都在进步。sql server 有snapshot模式,DB2 9.7有当前已落实在CS隔离级别的缺省行为,IDS有use_lastcommit选项。
而且你所谓的不阻塞的结果,并不是MVCC的充要条件。MVCC是写不抑制读的充分条件,而且是一个开销过大的条件。MVCC的存在有可能导致snapshot too old的错误,这个你是否研究过?MVCC导致维护机制非常复杂,这点毋庸置疑吧。要不干嘛Oracle自己的Timesten不支持MVCC?
采用2VCC的DB2/INFORMIX/TIMESTEN都能做到写不抑制读。说到底,我怀疑你没弄清楚到底什么是MVCC,也没弄清楚他和write do not block read之间的关系。