博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[oracle实验] Locking:数据一致性和完整性
阅读量:4563 次
发布时间:2019-06-08

本文共 3792 字,大约阅读时间需要 12 分钟。

公车上看concept,有关oracle锁机制,跟MSSQL有些不同,抽空坐下实验验证一下

oracle通过锁机制在事务间提供数据并发、一致性和完整性,这些操作自动执行,无需用户干预。

情景模拟:多个用户并发修改数据表的某一行。这里实验一个B/S应用,多用户环境使用下列语句修改 HR.EMPLOYEES表

UPDATE employeesSET    email = ?, phone_number = ?WHERE  employee_id = ?AND    email = ?AND    phone_number = ?

这个语句确保在应用程序查询并显示给终端用户之后,正在修改的employee_id数据不会被修改。这样,应用程序避免出现一个用户覆盖了另一个用户做出的修改的问题,或叫lost update 

跟着下表操作验证:

时间 Session 1 Session 2 解释
t0
SELECT employee_id, email,        phone_number FROM   hr.employees WHERE  last_name = 'Himuro';EMPLOYEE_ID EMAIL   PHONE_NUMBER----------- ------- ------------        118 GHIMURO 515.127.4565
 

In session 1, the hr1 user queries

hr.employees for the Himuro record
and displays the employee_id (118),
email (GHIMURO), and phone number
(515.127.4565) attributes.

t1  
SELECT employee_id, email,        phone_number FROM   hr.employees WHERE  last_name = 'Himuro';EMPLOYEE_ID EMAIL   PHONE_NUMBER----------- ------- ------------        118 GHIMURO 515.127.4565

In session 2, the hr2 user queries

hr.employees for the Himuro record
and displays the employee_id (118),
email (GHIMURO), and phone number
(515.127.4565) attributes.

t2
UPDATE hr.employees SET phone_number='515.555.1234' WHERE employee_id=118AND email='GHIMURO'AND phone_number='515.127.4565';1 row updated.
   

In session 1, the hr1 user updates the

phone number in the row to
515.555.1234, which acquires a lock on
the GHIMURO row.

 t3    
UPDATE hr.employees SET phone_number='515.555.1235' WHERE employee_id=118AND email='GHIMURO'AND phone_number='515.127.4565';-- SQL*Plus does not show-- a row updated message or-- return the prompt.
 

In session 2, the hr2 user attempts to

update the same row, but is blocked
because hr1 is currently processing the
row.
The attempted update by hr2 occurs
almost simultaneously with the hr1
update.

 t4  

COMMIT;

Commit complete.

   

In session 1, the hr1 user commits the

transaction.
The commit makes the change for
Himuro permanent and unblocks
session 2, which has been waiting.

 t5    0 rows updated.  In session 2, the hr2 user discovers that 

the GHIMURO row was modified in such a

way that it no longer matches its
predicate.
Because the predicates do not match,
session 2 updates no records.

 t6  
UPDATE hr.employees SET phone_number='515.555.1235' WHERE employee_id=118AND email='GHIMURO'AND phone_number='515.555.1234';1 row updated.
   

In session 1, the hr1 user realizes that it

updated the GHIMURO row with the
wrong phone number. The user starts a
new transaction and updates the phone
number in the row to 515.555.1235,
which locks the GHIMURO row.

 t7    
SELECT employee_id, email,        phone_number FROM   hr.employees WHERE  last_name = 'Himuro';EMPLOYEE_ID EMAIL   PHONE_NUMBER----------- ------- ------------        118 GHIMURO 515.555.1234
 

In session 2, the hr2 user queries

hr.employees for the Himuro record.
The record shows the phone number
update committed by session 1 at t4.
Oracle Database read consistency
ensures that session 2 does not see the
uncommitted change made at t6.

 t8    
UPDATE hr.employees SET phone_number='515.555.1235' WHERE employee_id=118AND email='GHIMURO'AND phone_number='515.555.1234';-- SQL*Plus does not show-- a row updated message or-- return the prompt.
 

In session 2, the hr2 user attempts to

update the same row, but is blocked
because hr1 is currently processing the
row.

 t9  

ROLLBACK;

Rollback complete.

   

In session 1, the hr1 user rolls back the

transaction, which ends it.

t10   1 row updated.

In session 2, the update of the phone

number succeeds because the session 1
update was rolled back. The GHIMURO
row matches its predicate, so the update
succeeds.

t11  

COMMIT;

Commit complete.

Session 2 commits the update, ending

the transaction.

在 t2,t3,t4,t5时刻,很显然session2对employee的修改无效,避免了lost update发生。

 

转载于:https://www.cnblogs.com/iImax/archive/2013/05/27/oracle-locking.html

你可能感兴趣的文章
Eclipse修改已存在的SVN地址
查看>>
(转)使用 python Matplotlib 库绘图
查看>>
进程/线程切换原则
查看>>
正则表达式语法
查看>>
20165301 2017-2018-2 《Java程序设计》第四周学习总结
查看>>
Vue的简单入门
查看>>
urllib 中的异常处理
查看>>
通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了?
查看>>
gulp
查看>>
pgsql查询优化之模糊查询
查看>>
不变模式
查看>>
20181227 新的目标
查看>>
androidtab
查看>>
php 事件驱动 消息机制 共享内存
查看>>
剑指offer 二叉树的bfs
查看>>
LeetCode Maximum Subarray
查看>>
让我们再聊聊浏览器资源加载优化
查看>>
underscore demo
查看>>
CSS hack
查看>>
每日一小练——数值自乘递归解
查看>>