oracle数据库:锁和闩_笔记2
锁定问题
丢失更新
丢失更新(lost update)是一个经典的数据库问题。实际上,所有多用户计算机环境都存在这个问题。简单地说,出现下面的情况时(按以下所列的顺序),就会发生丢失更新。
1会话session1中的一个事务获取(查询)一行数据,放入本地内存,并显示给一个最终用户User1。
2会话session2中的另一个事务也获取这一行,但是将数据显示给另一个最终用户User2。
3User1使用应用修改了这一行,让应该更新数据库并提交。会话session的事务现在已经执行。
4User2也修改这一行,让应用更新数据库并提交。会话Session2的事务现在已经执行。
这个过程称为“丢失更新”,因为第3步所做的所有修改都会丢失。
许多工具可以保护你避免这种情况,如Oracle Forms和APEX(Application Express,用来创建Ask Tom网站的工具),这些工具能确保:从查询记录的那个时刻开始,这个记录没有改变,而且对它执行任何修改时都会将其锁定,但是其他程序做不到这一点(如手写的Visual Basic或Java程序)。为了保护你不丢失更新,这些工具在后台做了哪些工作呢?实际上就是要使用某种锁定策略,共有两种锁定策略:悲观锁定或乐观锁定。
悲观锁定
用户在屏幕上修改值之前,这个锁定方法就要起作用。例如,用户一旦有意对他选择的某个特定行(屏幕上可见)执行更新,如单击屏幕上的一个按钮,就会放上一个行锁。那个行锁定会持续到程序对行应用用户的修改,并且提交。
悲观锁定(pessimistic locking)仅用于有状态(stateful)或有连接(connected)环境,也就是说,你的应用与数据库有一条连续的连接,而且至少在事务生存期中只有你一个人使用这条连接。
假设你在使用一条有状态连接,应用可以查询数据而不做任何锁定
用户选择想更新的一行。在这个时间点上(即用户还没有在屏幕上做任何修改,但是行已经从数据库中读出一段时间了),应用会绑定用户选择的值,从而查询数据库,并确保数据尚未修改。
除了简单地查询值并验证数据尚未修改外,要使用FOR UPDATE NOWAIT锁定这一行。
根据屏幕上输入的数据,应用将提供绑定变量的值,然后重新从数据库查询这一行,这一次会锁定这一行,不允许其他会话更新。因此,这种方法称为悲观锁定(pessimistic locking)。
在试图更新之前就把行锁住了,因为我们很悲观,对于这一行能不能保持未改变很是怀疑。
http://www.52ij.com/jishu/5191.htmloracle数据库:锁和闩_笔记1
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5192.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
