乐观锁基本上是“我只会在修改数据时锁定数据,而不是在读取数据时锁定”。问题是,如果您不立即锁定数据,其他人可以在您这样做之前更改它并且您正在查看旧新闻(并且可以盲目地覆盖在您读取数据和更新数据之间发生的更改。 )
悲观锁定是在您读取数据时锁定数据,以便在您决定更新数据时确保没有人更改它。
这是一个应用程序决策,而不是 Oracle 决策,因为:
从表 1 中选择 x、y、z,其中 a = 2
不会锁定匹配的记录,但
SELECT x, y, z FROM table1 WHERE a = 2 FOR UPDATE
将要。所以你必须决定你是否可以接受乐观锁定
SELECT x, y, z FROM table1 WHERE a = 2
...时间流逝...
UPDATE table1
SET x = 1, y = 2, z = 3
WHERE a = 2
(您可能已经覆盖了其他人在此期间所做的更改)
或者需要悲观:
SELECT x, y, z FROM table1 WHERE a = 2 FOR UPDATE
...时间流逝...
UPDATE table1
SET x = 1, y = 2, z = 3
WHERE a = 2
(您确定自从您查询数据以来没有人更改过数据。)
在此处查看 Oracle 中可用的隔离级别。
http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/consist.htm#CNCPT621