首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Oracle中提高代码在读提交隔离级别上的安全处理?

如何在Oracle中提高代码在读提交隔离级别上的安全处理?
EN

Stack Overflow用户
提问于 2014-06-01 18:28:48
回答 1查看 88关注 0票数 0

我想知道在读提交的隔离级别中是否存在避免数据损坏的方法。

下面是我的问题的一个示例:两个使用相同表的会话。

代码语言:javascript
运行
复制
SSN1> ALTER TABLE APPLICANT ADD( AVGSLEVEL2 NUMBER(5,2) )

同时在另一次会议上..。

代码语言:javascript
运行
复制
SSN2> INSERT INTO SPossessed VALUES ( 000001, 'TRUCK DRIVING', 9 );

回到第一堂课..。

代码语言:javascript
运行
复制
 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#) );

那么第二次会议确实..。

代码语言:javascript
运行
复制
SSQN2> select AVGSLEVEL from APPLICANT;

但当第一次开庭时.

代码语言:javascript
运行
复制
SSN1> COMMIT;

..。那么第二次会议得到了什么?

代码语言:javascript
运行
复制
SSN2> select AVGSLEVEL from APPLICANT; 
SSN2> COMMIT;

如何改进包含的第一个会话SQL脚本,使其能够在读提交的隔离级别上安全地处理?

EN

回答 1

Stack Overflow用户

发布于 2014-06-01 20:55:22

在一个多用户环境中,我们必须意识到,单个用户可能会将事情与他们不协调的行为混淆起来。

这个问题没有被读到。SSN1中的更新没有考虑到卡车驾驶技能,这是完全合理的,因为第二节课还没有提交。用户可能会回滚,或者事务可能由于其他原因而失败。因此,当第一次会话中的用户执行他们的更新卡车驾驶时,并不存在作为一种可拥有的技能。

这完全安全。怎么会更安全呢?

现在,您可以通过序列化来检查未提交的事务。在用户#1执行更新之前,他们可以发出一个锁表SPOSSESSED语句。这将失败,因为SSN2有一个未提交的事务。或者,如果发布得足够早,将阻止SSN2在SSN1提交更新之前执行插入操作。

但是,SSN2 cab随后插入了卡车驾驶记录,因此APPLICANT.AVGSLEVEL仍然会失去理智。你对此无能为力..。

..。除了构建事务性API之外,该API强制执行业务规则,防止业务表中的数据随意或自发地修改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23983068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档