请教悲观封锁和乐观封锁的问题

[复制链接]
查看11 | 回复4 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
看了expert one on one 关于悲观封锁和乐观封锁的章节,理解不是很深刻。
感觉在悲观就是在查询时如果有更新意图就锁定该行,而乐观封锁就是直接更新该行。
大家来谈谈这两种有什么区别,分别应用于那些场合???
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
但又说两种封锁都可以使用for update 有点迷惑!!!
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
最初由 applezh 发布
[B]看了expert one on one 关于悲观封锁和乐观封锁的章节,理解不是很深刻。
感觉在悲观就是在查询时如果有更新意图就锁定该行,而乐观封锁就是直接更新该行。
大家来谈谈这两种有什么区别,分别应用于那些场合??? [/B]

个人认为for update必须甚用,如果是操作频繁的表,这样会造成很严重的阻塞,编程上我倾向于使用update table1 set col1='..' where col1='...' 的方式防止误更新
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
update table1 set col1='..' where col1='...'这种方式适用性差了些,
当我要update不确定列的时候就无法写了;
for upadate是为了防止丢失更新的出现,它只是锁定行,就是只会阻塞对改行的更新;
oracle的行锁应该不是稀缺资源;
为了防止在整个事务中别人对该行的修改,或者业务必须防止丢失更新的出现,是要用for update 的; 可以指定nowait,使得其他的试图更新该行的动作都马上产生exception ,而不要排队等待对该行的锁定;
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
pessimistic (悲观)locking和optimistic (乐观)locking是oracle保证数据并行访问和避免lost update的2种策略.
pessimistic (悲观)locking是指用户在读取和更新数据的时候,悲观的认为这期间其他用户可能会更新同一记录;因此在更新数据前读取数据的时候,尝试获得该记录的绝对锁,如果其他用户已经锁住该纪录,则被阻塞用户可以选择等待(select for upodate)还是取消等待(select for update nowait)。从而避免lost update,保证了数据一致性。
optimistic (乐观)locking是指用户在读取和更新数据的时候,乐观的认为这期间其他用户不可能更新同一记录,在更新数据前读取数据的时候,不会获得该记录的绝对锁;因此在更新纪录的时候,其他用户很可能已经修改过了该纪录;因此,在更新的时候需要采取自定义编码策略来避免lost update,保证数据一致性。
http://blog.itpub.net/post/901/45144
http://blog.itpub.net/post/901/48459
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行