# 有关锁定 (长文章)

Posted by 小吴 on March 27, 1998 at 07:44:31:

In Reply to: Re: 请说明清楚 posted by 普罗米修斯 on March 27, 1998 at 04:20:43:

只要你会存取到资料库就会用到锁定。
锁定可分 shared lock, row lock, page lock, table lock 等等。
一般情况下当你读取资料库的时候是 shared lock，也可以说是没有 lock 啦！
当你要新增/修改资料时有可能会是 row lock 或 page lock。
如果一次修改太多资料而且散落在资料库多处，资料库会自动转换为 table lock。
基本上上面的各种 lock，除非你是使用大型 SQL Server 例如 MS SQL 6/7, Oracle...，否则都是资料库帮你决定，例如 Access 就是这样。

至于你要注意的就是编辑时候的 lock 了。有乐观锁定和悲观锁定两种。
编辑资料库中的资料没什么好大不了的，但是如果在多人使用的环境下，两个用户同时修改到同一笔资料怎么办？这时你的程式就必须对这种情况做处理。你可以选择乐观或悲观两种锁定方式。要注意！这两个方式所写出来的程式是不同的！！因此要在写程式前便要仔细考量。

所谓悲观锁定的意思是：我很悲观地认为当我在修改资料的时候，别人很有可能也来编辑同一笔资料。这时我在下 .Edit 这个方法时就把该笔资料或该页给锁住，一直要到我 .Update 才释放。在这段期间若别人来改同一笔资料的话，在下 .Edit 方法时便会发生错误。
悲观锁定的程式比较好写，也较易懂，但是注意大部分的资料库是采用 page lock，也就是你编修一笔，但是锁定的却是该笔资料附近的数笔资料，如果你的资料库使用的人数一多，page lock 相对会多，这时系统会自动转为 table lock，这时后来的用户要修改便不行了 (虽然他要修改的资料事实上没人修改到)。因此悲观锁定在用户一多的情况下效率会降低。

至于乐观锁定就是：我很乐观地认为当我在修改资料的时候，别人不会来编辑同一笔资料。因此当我修改资料的时候，我并不锁定该笔资料，但是当我下 .Update 方法的时候，如果该笔资料在我编辑的期间被别人修改了，我便会发生错误。

要注意喔！对同一笔资料而言，悲观锁定是先下 .Edit 的人先赢，后下的的人触发错误。而乐观锁定则是先下 .Update 方法的人先赢，后下 .Update 的人则触发错误。

在实际例子中，除了乐观及悲观锁定要注意之外。你还要注意一种状况：
就是我们通常是先把资料从资料库读出来之后，显示在画面上让使用者修改，使用者改完之后再一次存回资料库。使用者在画面上修改资料的时候是没有资料库锁定的 (虽然你也可以这么做，但是强烈不建议这么做)，万一其他使用者改了同一笔资料时，你是要直接盖过去还是发生错误呢？这点你也要加以考虑。

这可是我开板以来写过最长的一篇回答。你可千万要看懂呀！

Follow Ups:

- Re: 有关锁定 (长文章) 普罗米修斯 09:28:25 3/27/98 (0)