[ 来源: | 作者: | 时间:2007-06-26 | 收藏 | 推荐 ] 【大 中 小】
上回提到了OpenResultset方法,可以有以下数种型态的Cursor
rdOpenForwardOnly rdOpenStatic rdOpenDynamic rdOpenKeyset
也提及了SQL Server/ Informix的Server/Client端Cursor与之搭配的记录,再来讨论
OpenResultset的 LockType,这LockType的设定主要是为了多人同时使用的环境而设。
rdConcurReadOnly 1 (预设值)唯读的。
rdConcurLock 2 悲观的平行。
rdConcurRowVer 3 基於资料列 ID之乐观的平行。
rdConcurValues 4 基於资料列值之乐观的平行。
rdConcurBatch 5 使用批次模式更新之乐观的平行处理。为每一笔成功地被
更新的资料列传回 Status 值。
而我们这里针对的是前4者加以讨论。
如果是rdUseODBC 的Client端Cursor,上回提过,它只能有rdOpenForwardOnly 及
rdOpenStatic两种型态(使用其他型态时,可能也不会有误,但行为只有这两种模式)
而使用的锁定模式呢,只能是rdConcurReadOnly/rdConcurValues 而其他的锁定模式呢
使用下去,可能会有错,也可能没有,那要看ODBC Driver的厂商如何写,但其锁定行模
式应只有上述说的这两种(rdConcurBatch我未研究)。
如果是Server端的Cursor(rdUseServer),那才能使用这前四种锁定方式;rdConcurReadOnly
不用多说,那代表该Cursor不是Update Cursor,只能读取。而rdConCurLock是悲观的锁
定,根据我的Testing ,SQL Server6.5 其悲观的锁定的特性是:只要在OpenResultset
时,者就会在RowSetSize数目的列上做一个Update Lock,如果是Page Lock的状态,那
至少会把各个Row所在的Page上的列全Lock住,因此Lock住的列可不只RowSetSize的数目
。当然,这只是某些情况之下会如此,SQL SERVER会看实际的情况来Handle Lock,说不
定会Lock整个Table也不一定。这里要提一下Lock的种类:
Share Lock : 同时之间有很多Procee可以Share Lock住某一笔资料,一般读取时有时会
在上面做个Share Lock(并不是每一种都会,要看我们先前的设定)
Exclusive Lock : 某一笔Record不能有其他的任何Lock(含Share Lock)时,才能Lock成,
一般在update/delete等动作时,会先Exclusive Lock该笔,成功时才能再
做往後的动作。
Update Lock:或称Promotable Lock,这个Lock是为了Current Record有所更动而设计,
它允许Share Lock与之共存,但不可以有其他的Exclusive/Update Lock存
在。它在真的要Update时会把Update Lock提升成Exclusive Lock,所以啦,
在它真的要Update前於其上的所有Lock(包括Share Lock)都要解除才能成功。
+----------------+----------------------------------------------------
| | 目前已有的Lock |
|----------------+---------+-----------+------------+----------------|
|想要完成之Lock | no lock | Share Lock| Update Lock| Exclusive Lock |
|----------------|---------+-----------+------------+----------------|
|share lock | 可 可 可 不可 |
|update lock | 可 可 不可 不可 |
|exclusive lock | 可 不可 不可 不可 |
|----------------+---------------------------------------------------+
以下我暂且用Row Lock来解释一些东西,读者可另外推及Page Lock。
(阅读次数:)