【发布时间】:2016-05-27 19:34:38
【问题描述】:
我是使用 Oracle 数据库 11g 的新手。
我正在使用 SQL Developer 测试表和行锁。
我的表中有这样一行:
- id : 1
- 描述:'abc'
我进行了更新,但未提交将字段 desc 更改为 'zxc'。在另一个会话中,我做了一个返回旧记录的选择:
- id : 1
- 描述:'abc'
我在想它会给我一个错误或其他东西,因为我不想看到旧数据。
最后,当我在另一个会话中提交时,我在第二个会话中再次执行了查询并返回了提交的数据。
如何防止读取旧数据?
更新:
我阅读了有关 sql“SELECT FOR UPDATE”的信息,它阻止获取未提交的行,但例如有人告诉我有关银行的信息,所以我不确定这种方法是否具有良好的性能,而其他问题是关于丢失的没有提交的连接。也许我需要使用函数或 PLSQL 来最小化丢失的连接,实际上我正在使用 PHP 脚本(Laravel 框架)。
提前致谢。
【问题讨论】:
-
就像编辑共享文档一样。您真的希望其他用户在您点击
Save之前看到您的更改吗?数据库提交就像保存文档。只有在您明确声明您通过提交批准更改后,更改才应该对全世界可见。您可以更改隔离级别(读取未提交)以更改该行为,但是对于像 Oracle 这样的数据库,我想不出一个好的理由来这样做。 -
我希望 sql 会给我一个错误。仅在提交或回滚后获取行
-
@user2876735 想象一下这将如何在银行交易环境中工作。插入一行时,一切都必须停止。系统不知道哪个客户的账户会受到影响,所以一切都必须停止,直到“提交”或“回滚”。在那种世界里,几乎没有什么工作是可能的。
标签: php oracle isolation-level database-locking rowlocking