ReadCommitted Isolation Level是否设置了所选数据的任何块?它会在以下工作流程中失败:
transaction 1: read record with id 1
transaction 2: read record with id 1
transaction 1: update record with id 1 and commit
transaction 2: update record with id 1 and commit
根据我的知识,ReadCommitted应该允许它,不应该吗?
答案 0 :(得分:2)
答案可能取决于您使用的DBMS。在Oracle中它不会失败,但事务2的更新将被事务1阻止,直到事务1提交,此时事务2的更新将通过。
答案 1 :(得分:1)
是的,这是允许的。除非您在外部同步客户端,使得第二个客户端仅在第一个客户端收到肯定确认其提交成功后才给出COMMIT
,否则执行UPDATE
的顺序是未定义的(仅限数据库)需要假装这些是序列化的,但没有排序保证),因此编写它们以便修改现有数据而不是替换它,和/或在SELECT
中引用WHERE
结果是有帮助的}子句使UPDATE
以未修改的行为条件。 E.g:
-> SELECT key,value FROM mytable WHERE key = 1;
1 row:
key|value
1 |foo
-> UPDATE mytable SET value='bar' WHERE key = 1 AND value = 'foo';
0 rows affected
这表明另一个查询修改了它们之间的行。