我想知道在读提交的隔离级别中是否存在避免数据损坏的方法。
下面是我的问题的一个示例:两个使用相同表的会话。
SSN1> ALTER TABLE APPLICANT ADD( AVGSLEVEL2 NUMBER(5,2) )
同时在另一次会议上..。
SSN2> INSERT INTO SPossessed VALUES ( 000001, 'TRUCK DRIVING', 9 );
回到第一堂课..。
SSN1> UPDATE APPLICANT
2 SET AVGSLEVEL = ( ( SELECT SUM(SKILLLEVEL)
3 FROM SPOSSESSED
4 WHERE A# = APPLICANT.A# ) /
5 ( SELECT COUNT(*)
6 FROM SPOSSESSED
7 WHERE A# = APPLICANT.A#) );
那么第二次会议确实..。
SSQN2> select AVGSLEVEL from APPLICANT;
但当第一次开庭时.
SSN1> COMMIT;
..。那么第二次会议得到了什么?
SSN2> select AVGSLEVEL from APPLICANT;
SSN2> COMMIT;
如何改进包含的第一个会话SQL脚本,使其能够在读提交的隔离级别上安全地处理?
发布于 2014-06-01 20:55:22
在一个多用户环境中,我们必须意识到,单个用户可能会将事情与他们不协调的行为混淆起来。
这个问题没有被读到。SSN1中的更新没有考虑到卡车驾驶技能,这是完全合理的,因为第二节课还没有提交。用户可能会回滚,或者事务可能由于其他原因而失败。因此,当第一次会话中的用户执行他们的更新卡车驾驶时,并不存在作为一种可拥有的技能。
这完全安全。怎么会更安全呢?
现在,您可以通过序列化来检查未提交的事务。在用户#1执行更新之前,他们可以发出一个锁表SPOSSESSED语句。这将失败,因为SSN2有一个未提交的事务。或者,如果发布得足够早,将阻止SSN2在SSN1提交更新之前执行插入操作。
但是,SSN2 cab随后插入了卡车驾驶记录,因此APPLICANT.AVGSLEVEL仍然会失去理智。你对此无能为力..。
..。除了构建事务性API之外,该API强制执行业务规则,防止业务表中的数据随意或自发地修改。
https://stackoverflow.com/questions/23983068
复制相似问题