時間 |
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. |