日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle编程入门经典 第12章 事务处理和并发控制

發(fā)布時間:2025/3/21 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle编程入门经典 第12章 事务处理和并发控制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

12.1????????? 什么是事務(wù)處理... 1

12.2????????? 事務(wù)處理控制語句... 1

12.2.1?????? COMMIT處理... 2

12.2.2?????? ROLL BACK處理... 2

12.2.3?????? SAVEPOINT和ROLL BACK TO SAVEPOINT. 3

12.2.4?????? SET TRANSACTION.. 3

試驗:凍結(jié)視圖... 4

12.2.5?????? SET CONSTRAINTS. 5

12.3????????? 事務(wù)處理的ACID屬性... 7

12.3.1?????? 原子性... 7

12.3.2?????? 一致性... 7

試驗:事務(wù)處理級別的一致性... 8

12.3.3?????? 隔離性... 11

12.3.4?????? 持久性... 11

12.4????????? 并發(fā)控制... 11

12.4.1?????? 鎖定... 12

試驗:引發(fā)死鎖... 12

12.4.2?????? 多版本和讀取一致性... 15

考慮一個進(jìn)一步的示例。... 16

12.5????????? 小結(jié)... 17

?

?

?

?

開發(fā)者能夠命名他們的PL/SQL程序塊,為它們確定參數(shù),將它們存儲在數(shù)據(jù)庫中,并且從任何數(shù)據(jù)庫客戶或者實用工具中引用或者運行它們,例如 SQL*Plus、Pro*C,甚至是JDBC。

這此聽PL/SQL程序稱為存儲過程和函數(shù)。它們的集合稱為程序包。在本章中,我們將要解釋使用過程、函數(shù)和程序包的三大優(yōu)勢、這三種相似結(jié)構(gòu)之間的區(qū)別。

?

Oracle 9i產(chǎn)品幫助文檔:

http://docs.oracle.com/cd/B10501_01/index.htm

可根據(jù)自己需要進(jìn)行查詢,包含了眾多的文檔。

?

Sample Schemas的目錄:

http://docs.oracle.com/cd/B10501_01/server.920/a96539/toc.htm

?

Sample Schemas的文檔(示例模式的表及介紹):

http://docs.oracle.com/cd/B10501_01/server.920/a96539.pdf

?

在討論這2個特性的時候,我們將要在本章中學(xué)習(xí)如下內(nèi)容:

●Oracle中的事務(wù)處理是什么

●怎樣控制Oracle中的事務(wù)控制

●Oracle怎樣在數(shù)據(jù)庫中實現(xiàn)并發(fā)控制,讓多個用戶同時訪問和修改相同的數(shù)據(jù)表

?

12.1? 什么是事務(wù)處理

用于有效記錄某機構(gòu)感興趣的業(yè)務(wù)活動(稱為事務(wù))的數(shù)據(jù)處理(例如銷售、供貨的定購或貨幣傳輸)。通常,聯(lián)機事務(wù)處理 (OLTP) 系統(tǒng)執(zhí)行大量的相對較小的事務(wù)。

12.2? 事務(wù)處理控制語句

Oracle中的一個重要概念就是沒有“開始事務(wù)處理”的語句。用戶不能顯式開始一個事務(wù)處理。事務(wù)處理會隱式地開始于第一條修改數(shù)據(jù)的語句,或者一些要求事務(wù)處理的場合。使用COMMIT或者ROLL BACK語句將會顯式終止事務(wù)處理。

如上所述,事務(wù)處理具有原子性,也就是說,或者所有語句都成功執(zhí)行,或者所有語句都不能成功執(zhí)行。我們會在這里介紹其中一些成員:

●COMMIT

●ROLL BACK

●SAVEPOINT

●ROLL BACK TO<SAVEPOINT>

●SET TRANSACTION

●SET CONSTRAINT(S)

?

12.2.1???????????? COMMIT處理

作為開發(fā)者,用戶應(yīng)該使用COMMIT或者ROLL BACK顯式終止用戶的事務(wù)處理,否則用戶正在使用的工具/環(huán)境就將為用戶選取其中一種方式。

無論事務(wù)處理的規(guī)模如何,提交都是非常快速的操作。用戶可能會認(rèn)為事務(wù)處理越大(換句話說,影響的數(shù)據(jù)越多),提交所耗費時間越長。事實并非如此,進(jìn)化論事務(wù)處理規(guī)模如何,提交的響應(yīng)時間通常都很“平緩”。這是因為提交實際上沒有太多的工作去做,但是它所做的工作卻至關(guān)重要。

如果能夠理解這點,那么就可以避免許多開發(fā)者所采用的工作方式,去限制他們的事務(wù)處理規(guī)模,每隔若干行就進(jìn)行提交,而不是當(dāng)邏輯單元的工作已經(jīng)執(zhí)行完畢之后才進(jìn)行提交。他們這樣做是因為他們錯誤地認(rèn)為他們正在降低系統(tǒng)資源的負(fù)載;而事實上,他們正在增加負(fù)載。如果提交一行需要耗費X個時間單元,那么提交1000行也會消耗相同的X個時間單元,而采用1000次提交1行的方式完成這項工作就需要額外運行1000*X個時間單元。如果只在必要的時候進(jìn)行一次提交(當(dāng)事務(wù)處理完成的時候),那么用戶就不僅可以提高性能,而且可以減少對共享資源(日志文件,保護(hù)SGA內(nèi)共享數(shù)據(jù)結(jié)構(gòu)的鎖定)的爭用。

那么,為什么無論事務(wù)處理的規(guī)模如何,提交的響應(yīng)時間都相當(dāng)平緩呢?這是因為在數(shù)據(jù)庫中進(jìn)行提交之前,我們已經(jīng)完成了所有實際工作,我們已經(jīng)修改了數(shù)據(jù)庫中的數(shù)據(jù),完成了99.9%的工作。

當(dāng)提交的時候,我們還要執(zhí)行三個任務(wù):

●為我們的事務(wù)處理生成 SCN(系統(tǒng)改變編號)。這是Oracle的內(nèi)部時鐘,可以稱為數(shù)據(jù)庫時間。SCN不是傳統(tǒng)意義上的時鐘,因為它不是隨著時間失衡而遞進(jìn)。相反,它是在事務(wù)處理提交的時候遞進(jìn),由Oracle在內(nèi)部使用,以對事務(wù)處理排序。

●將所有剩余的已經(jīng)緩沖的重做日志表項寫入磁盤,并且將SCN記錄到在重做日志文件中。這要由LGWR執(zhí)行。

●釋放我們的會話(以及所有正在等等我們所占有鎖定的用戶)所占有的所有鎖定。

LGWR不會一直緩沖完成的所有工作,而是會隨著操作的進(jìn)行,在后臺不斷清理重做日志緩沖的內(nèi)容,這非常類似于在PC機上運行的磁盤緩沖軟件。它可以避免在清理所有的用戶重做日志時,提交操作出現(xiàn)長時間等待現(xiàn)象。LGWR會在以下情況執(zhí)行清理工作:

●每隔3秒

●當(dāng)SGA中的日志緩沖超過了1/3的空間,或者包含了1MB或者更多的已緩沖數(shù)據(jù)

●進(jìn)行任何事務(wù)處理提交

所以,即使我們長時間運行事務(wù)處理,也會有部分它所產(chǎn)生的已緩沖重做日志在提交之前寫入了磁盤。

?

12.2.2???????????? ROLL BACK處理

當(dāng)我們進(jìn)行回滾的時候,我們還有一些任務(wù)需要執(zhí)行:

●撤銷所有已經(jīng)執(zhí)行的改變。這要通過讀取我們生成的UNDO數(shù)據(jù),有效地反轉(zhuǎn)我們的操作來完成。如果我們插入了一行,那么回滾就要刪除它。如果我們更新了一行,回滾就要將其更新到原來的樣子。如果我們刪除了一行,就要重新插入它。

●釋放我們的會話(以及正在等等我們已經(jīng)鎖定的行的用戶)占用的所有鎖定。

?

12.2.3???????????? SAVEPOINT和ROLL BACK TO SAVEPOINT

SAVEPOINT可以讓用戶在事務(wù)處理中建立標(biāo)記點。用戶可以在單獨的事務(wù)處理中擁有多個保存點。當(dāng)使用ROLL BACK TO <SAVEPOINT NAME>的時候,它就可以讓用戶有選擇地回滾更大的事務(wù)處理中的一組語句。

保存點是委有用的事務(wù)處理特性,它們可以讓用戶將單獨的大規(guī)模事務(wù)處理分割成一系列較小的部分。擬執(zhí)行的所有語句仍然是較大的事務(wù)處理的組成部分,用戶可以將特定的語句組織到一起,將它們作為單獨的語句進(jìn)行回滾。

為了做到這一點,用戶需要在開始函數(shù)的時候使用如下的SQL語句:

Savepoint function_name;

?

這里的function_name是用戶的函數(shù)名稱。如果用戶在處理期間遇到錯誤,用戶就只需使用:

Roll back to function_name;

?

?

12.2.4???????????? SET TRANSACTION

這個語句可以使您設(shè)置事務(wù)處理的各種屬性,例如它的隔離層(參考以下的隔離層次列表),它是只讀還是可以進(jìn)行讀寫,以及是否要使用特定的回滾段。

SET TRANSACTION語句必須是事務(wù)處理中使用的第一個語句。這就是說,必須在任何INSERT、UPDATE或者DELETE語句,以及任何其它可以開始事務(wù)處理的語句之前使用它。SET TRANSACTION的作用域只是當(dāng)前的事務(wù)處理。

SET TRANSACTION語句可以讓用戶:

●規(guī)定事務(wù)處理隔離層次。

●規(guī)定為用戶事務(wù)處理所使用的特定回滾段。

●命名用戶事務(wù)處理。

?

我們將要在這里使用的重要SET TRANSACTION語句包括:

●SET TRANSACTION READ ONLY

●SET TRANSACTION READ WRITE

●SET TRANSACTION ISOLACTION LEVEL SERIALIZABLE

●SET TRANSACTION ISOLACTION LEVEL READ COMMITTED

注意:

SET TRANSACTION語句事實上都是互斥的。例如,如果您選擇了READ ONLY,那么就不能為它選擇READ WRITE、SERIALIZABLE或者READ COMMITTED。

?

  • READ ONLY
  • 命令SET TRANSACTION READ ONLY將會做2件事,它會確保您無法執(zhí)行修改數(shù)據(jù)的DML操作,例如INSERT、UPDATE或者DELETE。如下所示:

    SQL> set transaction read only;事務(wù)處理集。SQL> update emp set ename=lower(ename); update emp set ename=lower(ename)* ERROR 位于第 1 行: ORA-01456: 不可以在 READ ONLY 事務(wù)處理中執(zhí)行插入/刪除/更新操作

    ?

    ?

    其效果很明顯。而READ ONLY事務(wù)處理的另一個副作用則更為微妙。通過將事務(wù)處理設(shè)置為READ ONLY,我們就可以有效地將我們的數(shù)據(jù)庫視圖凍結(jié)到某個時間點。我的意思是,無論數(shù)據(jù)庫中的其它會話如何工作,數(shù)據(jù)庫在我們的面前都會是使用SET TRANSACTION語句時候樣子。這有什么用處呢?我們假定現(xiàn)在是一個繁忙的工作日的下午1點。用戶需要運行一個報表。這個報表將要執(zhí)行幾十條查詢,從許多數(shù)據(jù)源中獲取數(shù)據(jù)。所有這些數(shù)據(jù)都會相互關(guān)聯(lián),為了使其有意義,它們必須保持一致。換句話說,用戶需要每個查詢都看到“1點鐘”的數(shù)據(jù)庫。如果每個查詢看不同時間點的數(shù)據(jù)庫,那么我們報告中的結(jié)果就沒有意義。

    為了確保用戶數(shù)據(jù)一致,用戶應(yīng)該鎖定報表查詢所需的所有表,防止其它用戶更新它們。作為一種替代的方法,用戶可以使用SET TRANSACTION READ ONLY語句,凍結(jié)“1點鐘”的用戶數(shù)據(jù)庫視圖。這可以得到兩全其美的結(jié)果。

    試驗:凍結(jié)視圖

    (1)?????? 為了運行這個示例,用戶需要在SQL*Plus中打開3個會話。建立一個表。

    SQL> create table t as select object_id from all_objects where rownum<=2000; 表已創(chuàng)建。

    ?

    (2)?????? 用以觀察READ ONLY和READ WRITE事務(wù)處理區(qū)別。

    時間

    會話1

    會話2

    會話3

    注釋

    T1

    set transaction read only;

    ?

    ?

    ?

    T2

    select count(*) from t;

    select count(*) from t;

    ?

    2個事務(wù)處理都可以看到2000行

    T3

    ?

    ?

    delete from t where rownum<=500;

    從T中刪除500行,但是沒有提交

    T4

    select count(*) from t;

    select count(*) from t;

    ?

    由于多版本的作用,所以這2個會話都會看到2000行

    T5

    ?

    ?

    commit;

    讓500個已刪除的行永久刪除

    T6

    select count(*) from t;

    select count(*) from t;

    ?

    會話1仍然會看到2000行,會話2現(xiàn)在將要看到1500行!到提交或者回滾為止,會話1將會一直看到200行

    T7

    ?

    ?

    insert into t select * from t;

    對T的規(guī)模進(jìn)行加倍,使其達(dá)到3000個記錄

    T8

    ?

    ?

    commit;

    使得改變可見

    T9

    select count(*) from t;

    select count(*) from t;

    ?

    會話1會繼續(xù)看到2000行。會話2現(xiàn)在可以看到所有的3000行

    T10

    commit;

    ?

    ?

    ?

    T11

    select count(*) from t;

    ?

    ?

    會話1現(xiàn)在也可以看到3000行。

    ?

  • READ WRITE
  • 第二個命令SET TRANSACTION READ WRITE不會經(jīng)常使用,因為它是默認(rèn)設(shè)置。很少有必要使用這個命令,在這里包含它只是出于完整性的考慮。

    ?

  • ISOLATION LEVEL SERIALIZABLE
  • SET TRANSACTION ISOLATION LEVEL SERIALIZABLE與READ ONLY有一些類似。當(dāng)使用了這個命令之后,無論是否出現(xiàn)改變,數(shù)據(jù)庫都會為您進(jìn)行“凍結(jié)”。就如同我們在READ ONLY事務(wù)處理中看到的那樣,您可以完全隔離其它事務(wù)處理的影響。

  • ISOLATION LEVEL READ COMITTED
  • 這個命令大體相當(dāng)于將事務(wù)處理設(shè)置為READ WRITE,由于它是設(shè)置隔離層次時Oracle的默認(rèn)操作模式,所以很少使用。如果您在會話的前面使用ALTER SESSION命令,將用戶會話的事務(wù)處理的默認(rèn)隔離層次從READ COMMITTED改變?yōu)镾ERIABLIZABLE,那么就可以會用到這個命令。使用ISOLATION LEVEL READ COMMITTED命令可以重置默認(rèn)值。

    12.2.5???????????? SET CONSTRAINTS

    在Oracle中,約束可以在DML語句執(zhí)行后立即生效,也可以延遲到事務(wù)處理提交的時候才生效。SET CONSTRAINT語句可以讓您在事務(wù)處理中設(shè)置延遲約束的強制模式。可以使用如下語法延遲單獨的約束:

    set constraint constraint_name defferred

    ?

    或者,您也可以使用如下語法延遲所有約束:

    set constraints all defferred

    ?

    在這些命令中,您可以使用關(guān)鍵字IMMEDIATE代替DEFERRED,將他們的強制模式改回立即模式。為了看到實際的命令,我們可以使用一個簡單的示例:

    SQL> drop table t;表已丟棄。SQL> create table t2 (x int,3 constraint x_greater_than_zero check(x>0)4 deferrable initially immediate5 )6 /表已創(chuàng)建。SQL> insert into t values(-1); insert into t values(-1) * ERROR 位于第 1 行: ORA-02290: 違反檢查約束條件 (SCOTT.X_GREATER_THAN_ZERO)

    ?

    不錯,我們無法向X中插入值-1.現(xiàn)在,我們使用SET CONSTRAINT命令延遲約束的臉證,如下所示:

    SQL> set constraint x_greater_than_zero deferred; 約束條件已設(shè)置。SQL> insert into t values(-1); 已創(chuàng)建 1 行。

    ?

    然而,我們無法在數(shù)據(jù)庫中提交這條語句:

    SQL> commit; commit * ERROR 位于第 1 行: ORA-02091: 事務(wù)處理已重算 ORA-02290: 違反檢查約束條件 (SCOTT.X_GREATER_THAN_ZERO)

    ?

    有2種方法使用這個命令,或者規(guī)定一組約束名稱,或者使用關(guān)鍵詞ALL。例如,為了延遲約束X_GREATER_THAN_ZERO,我們可以使用:

    set constraint x_greater_than_zero deferred;

    ?

    我們也可以很容易地使用如下命令:

    set constraints all deferred;

    ?

    這里的區(qū)別是第2個版本使用了ALL,它會影響我們會話中的所有延遲約束,而不只是我們感興趣的約束。而且,為了明確使用用戶約束,也可以使用如下語句:

    set constraint <constraint_name> immediate;

    ?

    例如,我們可以在以上的救命中使用如下語句:

    SQL> set constraint x_greater_than_zero deferred;約束條件已設(shè)置。SQL> insert into t values(-1);已創(chuàng)建 1 行。SQL> set constraint x_greater_than_zero immediate; SET constraint x_greater_than_zero immediate * ERROR 位于第 1 行: ORA-02290: 違反檢查約束條件 (SCOTT.X_GREATER_THAN_ZERO)SQL> commit; commit * ERROR 位于第 1 行: ORA-02091: 事務(wù)處理已重算 ORA-02290: 違反檢查約束條件 (SCOTT.X_GREATER_THAN_ZERO)

    ?

    Oracle會回滾我們的事務(wù)處理。通過SET CONSTRAINT <constraint_name> IMMEDIATE命令,我們就能夠發(fā)現(xiàn)我們已經(jīng)違反了一些約束,而我們的事務(wù)處理仍然有效。這個約束將會處理延遲模式,它不會立即檢查。

    12.3? 事務(wù)處理的ACID屬性

    ACID是替代如下內(nèi)容的首字母縮寫:

    ●原子性(Atomicity)——事務(wù)處理要么全部進(jìn)行,要么不進(jìn)行。

    ●一致性(Consistency)——事務(wù)處理要將數(shù)據(jù)庫從一種狀態(tài)變成另一種狀態(tài)。

    ●隔離性(Isolation)——在事務(wù)處理提交之前,事務(wù)處理的效果不能由系統(tǒng)中其它事務(wù)處理看到。

    ●持久性(Durability)——一旦提交了事務(wù)處理,它就永久生效。

    ?

    12.3.1???????????? 原子性

    在Oracle中,事務(wù)處理具有原子性。換句話說,或者提交所有的工作,或者什么工作都不提交。

    12.3.2???????????? 一致性

    這是非常重要的事務(wù)處理特性,任何事務(wù)處理都會將數(shù)據(jù)庫從一種邏輯上的一致狀態(tài)轉(zhuǎn)變?yōu)榱硪环N邏輯上的一致狀態(tài)。這就是說,在事務(wù)處理開始之前,數(shù)據(jù)庫的所有數(shù)據(jù)都會滿足您已經(jīng)施加給數(shù)據(jù)庫的業(yè)務(wù)規(guī)則(約束)。

    我們所使用的表和觸發(fā)器如下所示:

    SQL> drop table t;表已丟棄。SQL> create table t2 ( x int,3 constraint t_pk primary key(x)4 )5 /表已創(chuàng)建。SQL> create trigger t_trigger2 after update on T for each row3 begin4 dbms_output.put_line('Updated x='||:old.x||' to x='||:new.x);5 end;6 /觸發(fā)器已創(chuàng)建

    ?

    現(xiàn)在,我們要向T中插入一些行:

    SQL> insert into t values(1);已創(chuàng)建 1 行。SQL> insert into t values(2);已創(chuàng)建 1 行。

    ?

    這就結(jié)束了這個示例的設(shè)置。現(xiàn)在,物體 嘗試對表T進(jìn)行更新,將所有行都設(shè)置為數(shù)值2。

    SQL> set serverout on SQL> begin2 update t set x=2;3 end;4 / Updated x=1 to x=2 Updated x=2 to x=2 begin * ERROR 位于第 1 行: ORA-00001: 違反唯一約束條件 (SCOTT.T_PK) ORA-06512: 在line 2

    ?

    現(xiàn)在,如果我們使用如下所示的成功語句:

    SQL> begin2 update t set x=x+1;3 end;4 / Updated x=1 to x=2 Updated x=2 to x=3PL/SQL 過程已成功完成。

    ?

    數(shù)據(jù)庫在邏輯上保持了一致(它滿足了所有的業(yè)務(wù)規(guī)則),所以語句將會成功。

    試驗:事務(wù)處理級別的一致性

    (1)?????? 我們要建立2個表PARENT和CHILD。CHILD表具有PARENT表上的外鍵,這個外鍵要定義為可延遲。

    SQL> create table parent(pk int,2 constraint parent_pk primary key(pk));表已創(chuàng)建。SQL> create table child(fk,2 constraint child_fk foreign key(fk)3 references parent deferrable);表已創(chuàng)建。

    ?

    (2)?????? 現(xiàn)在,我們使用一些數(shù)據(jù)生成這些表。

    SQL> insert into parent values(1);已創(chuàng)建 1 行。SQL> insert into child values(1);已創(chuàng)建 1 行。

    ?

    (3)?????? 現(xiàn)在,我們嘗試更新PARENT表,改變它的主鍵值。

    SQL> update parent set pk=2; update parent set pk=2 * ERROR 位于第 1 行: ORA-02292: 違反完整約束條件 (SCOTT.CHILD_FK) - 已找到子記錄日志

    ?

    (4)?????? 為了解決這個問題,我們只需告訴Oracle我們將要延遲約束CHILD_FK,也就是說,我們不想它在語句層次進(jìn)行檢查。

    SQL> set constraints child_fk deferred; 約束條件已設(shè)置。

    ?

    (5)?????? 現(xiàn)在,我們可以正確地更新PARENT表

    SQL> update parent set pk=2; 已更新 1 行。SQL> select * from parent;PK ----------2SQL> select * from child;FK ----------1 SQL> commit; commit * ERROR 位于第 1 行: ORA-02091: 事務(wù)處理已重算 ORA-02292: 違反完整約束條件 (SCOTT.CHILD_FK) - 已找到子記錄日志

    ?

    (6)?????? 我們再次進(jìn)行嘗試,看看如何讓Oracle驗證我們數(shù)據(jù)的邏輯一致性,而不進(jìn)行回滾。我們首先會再次設(shè)置約束DEFERRED,然后再次更新父表,重做Oracle剛才撤銷的工作。

    SQL> set constraints child_fk deferred; 約束條件已設(shè)置。SQL> update parent set pk=2; 已更新 1 行。SQL> select * from parent;PK ----------2SQL> select * from child;FK ----------1

    ?

    (7)?????? 我們現(xiàn)在將CHILD_FK約束設(shè)置為IMMEDIATE。這將導(dǎo)致Oracle立即驗證我們業(yè)務(wù)規(guī)則的一致性。

    SQL> set constraints child_fk immediate; SET constraints child_fk immediate * ERROR 位于第 1 行: ORA-02291: 違反完整約束條件 (SCOTT.CHILD_FK) - 未找到父項關(guān)鍵字

    ?

    (8)?????? 現(xiàn)在,我們可以更新CHILD記錄,再次檢查約束并且提交

    SQL> update child set fk=2; 已更新 1 行。SQL> set constraints child_fk immediate; 約束條件已設(shè)置。SQL> commit; 提交完成。 SQL> select * from parent;PK ----------2SQL> select * from child;FK ----------2

    ?

    這將會導(dǎo)致一致性數(shù)據(jù)滿足我們的約束。

    12.3.3???????????? 隔離性

    在給定用戶隔離層次的情況下,使用相同的輸入,采用相同的方式執(zhí)行的相同的工作可能會導(dǎo)致不同的答案,這些隔離層次采用指定層次上許可(或者不符合規(guī)定)的三種“讀取”方式進(jìn)行定義。它們是:

    ●臟讀取(Dirty read)——這種讀取方式的含義同它聽起來一樣糟糕。您可以讀取沒有提交的“臟”數(shù)據(jù)。

    ●非可重復(fù)讀取(Non-repeatable read)——這種方式意味著,如果用戶在T1時刻讀取了一行,在T2時刻再次讀取一行,那么這個行就可能發(fā)生改變。例如,它可能已經(jīng)被刪除或者更新。

    ●影像讀取(Phantom read)——這種方式意味著如果用戶在T1時刻執(zhí)行了一個查詢,在T2時刻再次執(zhí)行它,就可能會有影響結(jié)果的附加行加入到數(shù)據(jù)庫中。在這種情況下,這種讀取方式與非可重復(fù)讀取有所不同,您已經(jīng)讀取的數(shù)據(jù)不會發(fā)生變化,而是會有比以前更多的滿足查詢條件的數(shù)據(jù)。

    SQL92采用了這三種“讀取”方式,并且基于它們的存在與否建立了4種隔離層次,見表13-2,它們是:

    隔離層次

    臟讀取

    非重復(fù)讀取

    影像讀取

    非提交讀取(Read Uncommitted)

    允許

    允許

    允許

    提交讀取(Read committed)

    禁止

    允許

    允許

    可重復(fù)讀取(Repeatable Read)

    禁止

    禁止

    允許

    串行讀取(Serializable)

    禁止

    禁止

    禁止

    ?

    12.3.4???????????? 持久性

    持久性是數(shù)據(jù)庫提供的最重要的特性之一。它可以確保一旦事務(wù)處理提交之后,它的改變就會永久生效。它們不會由于系統(tǒng)故障或者錯誤而“消失”。

    ?

    12.4? 并發(fā)控制

    開發(fā)多用戶、數(shù)據(jù)庫驅(qū)動的應(yīng)用 的主要挑戰(zhàn)之一就是要最大化并發(fā)訪問(多個用戶同時訪問數(shù)據(jù)),而且與此同時,還要確保每個用戶都能在一致的方式下讀取和修改數(shù)據(jù)。能夠提供這些功能的鎖定和并發(fā)控制是所有數(shù)據(jù)庫的關(guān)鍵特性。

    12.4.1???????????? 鎖定

    鎖定(lock)是用來控制共享資源并發(fā)訪問的機制。要注意,我們使用術(shù)語“共享資源”,而沒有使用“數(shù)據(jù)庫行”或者“數(shù)據(jù)庫表”。Oracle確實可以在行級別上鎖定表數(shù)據(jù),但是它還可以在許多不同的層次上使用鎖定,提供對各種資源的并發(fā)訪問。

    大多數(shù)情況下,鎖對于作為開發(fā)者的用戶來講是透明的。當(dāng)更新數(shù)據(jù)行的時候,我們不必對其進(jìn)行鎖定,Oracle會為我們完成這些工作。有些時候顯式鎖定是必須的,但是大多數(shù)時候,鎖定會自行管理。

    在單用戶的數(shù)據(jù)庫中,鎖根本沒有必要。因為根據(jù)定義,在這種情況下只有一個用戶會修改信息。然而,當(dāng)多用戶訪問或者修改數(shù)據(jù)或者數(shù)據(jù)結(jié)構(gòu)的時候,具有可以防止并發(fā)訪問修改相同信息的機制就分外重要。這就是鎖定的價值。

  • 死鎖
  • 當(dāng)2個用戶戰(zhàn)勝了2者都希望使用的資源時就會出現(xiàn)死鎖。

    Oracle處理死鎖的方式非常簡單。當(dāng)檢測出死鎖的時候(它們就會立刻被檢測出來),Oracle就會選擇一個會話作為“犧牲者”。

    試驗:引發(fā)死鎖

    (1)?????? 我們要建立2個所需要的表,如下所示:

    SQL> create table a as select 1 x from dual; 表已創(chuàng)建。SQL> create table b as select 1 x from dual; 表已創(chuàng)建。

    ?

    (2)?????? 現(xiàn)在,打開SQL*Plus會話,并且更新表A。

    SQL> update a set x=x+1;已更新 1 行。

    ?

    (3)?????? 新打開一個SQL*Plus會話,更新B表。

    SQL> update b set x=x+1;已更新 1 行。

    ?

    (4)?????? 在相同的會話,再一次更新a表

    SQL> update a set x=x+1;

    ?

    會發(fā)生死鎖。

  • 鎖定升級
  • 可以在許多層次上進(jìn)行鎖定。用戶可以在一行上擁有鎖定,或者實際上也可以在一個表上擁有鎖定。一些數(shù)據(jù)庫(盡管沒有Oracle)還可以在數(shù)據(jù)庫層次上鎖定數(shù)據(jù)。在一些數(shù)據(jù)庫中,鎖定是稀缺的資源,擁有許多鎖定可以負(fù)面地影響系統(tǒng)的性能。在這些數(shù)據(jù)庫中,你可以發(fā)現(xiàn)為了保存這些資源,用戶的100個行級別的鎖定會轉(zhuǎn)換為一個表級別的鎖定。這個過程就稱為鎖定升級(lock escalation)。它使得系統(tǒng)降低了用戶鎖定的粒度。

    鎖定升級不是數(shù)據(jù)庫想要的屬性。事實上,數(shù)據(jù)庫支持升級鎖定暗示著它的鎖定機制存在固有的系統(tǒng)開銷,管理上百個鎖定是需要處理的重要工作。在Oracle中,擁有一個鎖定或者上百萬個鎖定的系統(tǒng)開銷是相同的——沒有區(qū)別。

    Oracle會使用鎖定轉(zhuǎn)換(lock conversion)或者提升(promotion)。它將會在盡可能級別上獲取鎖定,并且將鎖定轉(zhuǎn)換到更具限制性的級別上。例如,如果使用FOR UPDATE子句從表中選取一行,那么就會應(yīng)用2個鎖定。一個鎖定會放置在您所選擇的行上。這個鎖定是的,它將會阻止其它的用戶鎖定指定行。另一個鎖定要放置在表上,它是一個ROW SHARE TABLE鎖。這個鎖將會阻止其它會話獲取表上的排它鎖。

  • 遺失更新
  • 阻塞(Blocking)會在一個會話擁有另一個會話正在請求的資源上的鎖定時出現(xiàn)。正在進(jìn)行請示的會話一直阻塞,直到占用資源的會話翻譯鎖定資源為止。例如,USER1、USER2同時查詢,1分鐘后,USER1修改了USER3的地址,USER2的會話仍然為1分鐘前的數(shù)據(jù),修改了USER3的電話號碼,此時,USER2的舊數(shù)據(jù)替換了USER1修改的數(shù)據(jù)。

  • 悲觀鎖定
  • 悲觀鎖定(Pessimistic locking)聽起來不好,但是相信我,它實際并非如此。在使用悲觀鎖定的時候,您就是在表明“我相信,某人很有可能會改變我正在讀取(并且最終要更新)的相同數(shù)據(jù),因此,在我們花費時間,改變數(shù)據(jù)之前,我要鎖定數(shù)據(jù)庫中的行,防止其它會話更新它”。

    為了完成這項工作,我們要使用類似如下語句的查詢:

    select * from table where column1 = : old_column1and column2 = : old.column2and...and primary_key = : old_primary_keyfor update nowait;

    ?

    所以我們將會從這個語句中得到三種結(jié)果:

    ●我們將要獲取我們的行,并且對這個行進(jìn)行鎖定,防止被其它會話更新(但是阻止讀取)。

    ●我們將會得到ORA-00054 Resource Busy錯誤。其它的人已經(jīng)鎖定了這個行,我們必須要等待它。

    ●由于某人已經(jīng)對行進(jìn)行了改變,所以我們將會返回0行。

    由于我們要在進(jìn)行更新之前對行進(jìn)行鎖定,所以這稱為悲觀鎖定(pessimistic locking)。我們對行維持不被改動并不樂觀(因此命名為悲觀)。用戶應(yīng)用中的活動流程應(yīng)該如下所示:

    ●不進(jìn)行鎖定查詢數(shù)據(jù)

    SQL> select empno,ename,sal from emp where deptno=10;EMPNO ENAME SAL ---------- ---------- ----------7782 CLARK 24507839 KING 50007934 MILLER 1300

    ?

    ●允許終端用戶“查詢”數(shù)據(jù)。

    SQL> select empno,ename,sal2 from emp3 where empno=79344 and ename='MILLER'5 and sal=13006 for update nowait7 /EMPNO ENAME SAL ---------- ---------- ----------7934 MILLER 1300

    ?

    ●假如我們鎖定了數(shù)據(jù)行,我們的應(yīng)用就可以使用更新,提交改變

    SQL> update emp2 set ename='miller'3 where empno=7934; 已更新 1 行。SQL> commit; 提交完成。

    ?

    在Oracle中,悲觀鎖定可以運行良好。它可以讓用戶相信他們正在屏幕上修改的數(shù)據(jù)當(dāng)前由他們所“擁有”。如果用戶要離開,或者一段時間沒有使用記錄,用戶就要讓應(yīng)用釋放鎖定,或者也可以在數(shù)據(jù)庫中使用資源描述文件設(shè)定空閑會話超時。這樣就可以避免用戶鎖定數(shù)據(jù)行,然后回家過夜的問題。

  • 樂觀鎖定
  • 第二種方法稱為樂觀鎖定(optimistic locking),這經(jīng)會在應(yīng)用中同時保存舊值和新值。

    我們首先作為用戶SCOTT登錄,并且打開2個SQL*Plus會話,我們要作為2個獨立的用戶(USER1和USER2)。然后,2個用戶都要使用以下的SELECT語句。

    USER1

    SQL> select * from dept where deptno=10;DEPTNO DNAME LOC ---------- -------------- -------------10 ACCOUNTING NEW YORK

    ?

    USER1更新

    SQL> update dept2 set loc='BOSTON'3 where deptno=10; 已更新 1 行。

    ?

    USER2更新

    SQL> update dept2 set loc='ALBANY'3 where deptno=10; 已更新 1 行。

    ?

    DEPTNO=10的LOC=’BOSTON’的記錄不再存在,所以這里更新了0行。我們樂觀地認(rèn)為更新可以完成。

  • 悲觀鎖定和樂觀鎖定
  • 悲觀鎖定最大的優(yōu)勢在于終端用戶可以在他們花費時間進(jìn)行修改之前,就能夠發(fā)現(xiàn)他們的改變不能夠進(jìn)行。而在樂觀鎖定的情況中,終端用戶將會花費大量的時間進(jìn)行修改。

    12.4.2???????????? 多版本和讀取一致性

    Oracle使用了多版本讀取一致性并發(fā)模型。從根本講,Oracle通過這個機制可以提供:

    ●讀取一致性查詢(Read-consistent queries):能夠產(chǎn)生結(jié)果與相應(yīng)時間點一致的查詢。

    ●非阻塞查詢(Non-blocking queries):查詢不會被數(shù)據(jù)定入器阻塞。

    SQL> drop table t;表已丟棄。SQL> create table t as select * from all_users;表已創(chuàng)建。SQL> set serverout on SQL> declare2 cursor c1 is select username from t;3 l_username varchar2(30);4 begin5 open c1;6 delete from t;7 commit;8 loop 9 fetch c1 into l_username;10 exit when c1%notfound;11 dbms_output.put_line(l_username);12 end loop;13 close c1;14 end;15 / SYS SYSTEM OUTLN DBSNMP WMSYS ORDSYS ORDPLUGINS MDSYS ……PL/SQL 過程已成功完成。

    ?

    雖然從表中刪除所有數(shù)據(jù),我們甚至可以提交刪除工作。這些行都不見了,我們也會這樣認(rèn)為。事實上,它們還可以通過游標(biāo)獲得。實際上,通過OPEN命令返回給我們的結(jié)果集在打開它的時候就已經(jīng)預(yù)先確定了。我們在獲取數(shù)據(jù)之前沒有辦法知道答案是什么,但是從游標(biāo)的角度來看,結(jié)果是不變的。并不是Oracle在我們打開游標(biāo)的時候,將所有以上數(shù)據(jù)復(fù)制到了其它的位置;事實上是刪除操作作為我們保留了數(shù)據(jù),將它們放置到了UNDO表空間或者回滾段中。

    考慮一個進(jìn)一步的示例。

    建立一個ACCOUNTS的表。可以使用如下方式建立它:

    SQL> create table accounts2 (3 account_id number,4 account_type varchar2(20),5 balance number6 );表已創(chuàng)建。

    ?

    精確快速地報告BALANCE總數(shù)。用戶需要報告時間以及所有賬戶余額總和:

    SQL> select current_timestamp,sum(balance) total_balance from accounts;

    ?

    注意:

    CURRENT_TIMESTAMP是Oracle 9i的內(nèi)建列,它將會返回當(dāng)前的日期和時間。在較早的Oracle版本中,用戶需要使用SYSDATE。

    然而,如果當(dāng)我們進(jìn)行處理的時候,這個數(shù)據(jù)庫表上要應(yīng)用成百上千個事務(wù)處理,那么問題就會稍微復(fù)雜一些。人們會從他們的儲蓄賬號向支票賬號劃轉(zhuǎn)資金,他們還要進(jìn)行取款、存款(我們可能是一個非常繁忙的銀行)等。

    我們假定ACCOUNTS表如表13-3所示:

    表13-3 ACCOUNTS表示例

    ACCOUNT_ID

    ACCOUNT_TYPE

    BALANCE

    1234

    儲蓄

    100

    5678

    支票

    4371

    2542

    儲蓄

    6232

    7653

    儲蓄

    234

    …<上百萬行>

    ?

    ?

    1234

    支票

    100

    我們的示例將要有2個結(jié)局,一個結(jié)局將要展示當(dāng)查詢檢測到鎖定靈氣的時候會出現(xiàn)什么情況,另一個結(jié)局展示當(dāng)查詢檢測到數(shù)據(jù)已經(jīng)發(fā)生改變,它不能夠看到它們的時候會出現(xiàn)什么情況。

    表13-4 查詢遇到鎖定數(shù)據(jù)

    時間

    事件

    注釋

    T1

    我們在會話1中開始查詢W(現(xiàn)在有150)

    它要開始對表進(jìn)行讀取,由于ACCOUNTS表非常大,所以這 需要花幾分鐘的時間。這個查詢已經(jīng)讀取了“第一行”的ACCOUNT_ID為1234儲蓄賬號,但是還沒有到達(dá)支票賬號

    T2

    賬號1234的所有者在ATM上開始事務(wù)處理

    ?

    T3

    賬號1234的所有者選取TRANSFERFUNDS,并且選取從他們的支票賬號向儲蓄賬號劃轉(zhuǎn)50美金(150-50)

    數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行了更新,所以支票賬號現(xiàn)在具有50美金,而儲蓄賬號具有150美金。工作還沒有提交(但是已經(jīng)存儲了UNDO信息)

    T4

    我們查詢最終到達(dá)ACCOUNT_ID為1234的支票賬戶行

    這時發(fā)生什么呢?在其它大多數(shù)流行數(shù)據(jù)庫中,答案是“查詢將要等待”。而Oracle中不會這樣

    T5

    由于檢測到數(shù)據(jù)已經(jīng)被T3時刻執(zhí)行的工作所鎖定,所以我們的查詢將要接受到UNDO信息(數(shù)據(jù)“以前的”映像),并且使用T1時刻的數(shù)據(jù)映像

    Oracle將要講到鎖定,它不會等待。我們查詢將要在支票賬號讀取到100美金

    T6

    我們的報告生成

    ?

    T7

    ATM提交并且完成

    ?

    本將操作的有意思的部分發(fā)生在以上時間鏈T5時刻

    表13-5 查詢遇到已經(jīng)改變的數(shù)據(jù)

    時間

    事件

    注釋

    T4

    ATM會話進(jìn)行提交,完成轉(zhuǎn)賬

    資金發(fā)生轉(zhuǎn)移,另外的會話現(xiàn)在可以看到在ACCOUNT_ID為1234的儲蓄賬號中有150美金,支票賬號中有50美金

    T5

    我們查詢最終到達(dá)ACCOUNT_ID為1234的支票賬戶行

    它不再鎖定,沒有人正在更新它

    T6

    由于檢測到在T1時刻之后數(shù)據(jù)已經(jīng)進(jìn)行了修改,我們的查詢將會接收到UNDO信息,并且使用T1時刻的數(shù)據(jù)映像

    我的查詢將要再次為支票賬號讀取100美金

    T6

    我們的報告生成

    ?

    簡單來說,Oracle除了刪除,在更新、增加中,能夠把UNDO表空間或者回滾段中的數(shù)據(jù)讀取出來,來為客戶展示它數(shù)據(jù)的一致性。

    12.5? 小結(jié)

    在本章中,我們首先了事務(wù)處理的構(gòu)成。了解了事務(wù)處理控制語句,以及怎樣和在什么時候使用它們。

    當(dāng)討論并發(fā)控制的時候,我們討論了2個重要而又復(fù)雜的主題,它們是鎖定和多版本讀取一致性。了解了死鎖、跟蹤文件分析死鎖、數(shù)據(jù)庫中避免阻塞等待的不同模式、悲觀鎖定和樂觀鎖定。

    ?

    文章根據(jù)自己理解濃縮,僅供參考。

    摘自:《Oracle編程入門經(jīng)典》 清華大學(xué)出版社?http://www.tup.com.cn


    from:?http://www.cnblogs.com/yongfeng/p/3219593.html

    總結(jié)

    以上是生活随笔為你收集整理的Oracle编程入门经典 第12章 事务处理和并发控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    亚洲激情 欧美激情 | 中文在线字幕观看电影 | 免费试看一区 | 超碰在线人人 | 精品视频在线视频 | 精品伊人久久久 | 日日日日日 | free,性欧美 九九交易行官网 | 91精品欧美一区二区三区 | 97av视频 | 久久免费视频网 | 国产精品一区二区电影 | 色偷偷人人澡久久超碰69 | 国产精品黄色在线观看 | 成人免费中文字幕 | 精品成人免费 | 在线免费观看黄色小说 | 久草在线久 | 丁香五月亚洲综合在线 | 欧美日韩精品在线观看视频 | 99视频精品| 欧美福利片在线观看 | 日日操狠狠干 | 99久久精品午夜一区二区小说 | 国产黄色在线网站 | 久久婷婷一区 | 欧美日韩国产成人 | 免费观看福利视频 | 免费成人av在线 | 亚洲精品观看 | 国产精品第三页 | 福利视频午夜 | 在线免费观看黄色av | 人人躁 | 亚洲一区在线看 | 色综合久久天天 | 成年人电影免费在线观看 | 婷婷网在线 | 最新av在线网站 | 欧美一级黄大片 | 亚洲成人欧美 | 成人影片在线免费观看 | 亚洲国产精品成人精品 | 亚洲 欧洲 国产 日本 综合 | 欧美在线日韩在线 | 成人一级在线 | 欧美久草网 | 亚洲 综合 专区 | 亚洲成人免费在线观看 | 色天天综合久久久久综合片 | 久久色网站 | 中文字幕永久 | 午夜精品一区二区国产 | 少妇性xxx | 一级做a爱片性色毛片www | 亚洲精品免费在线观看视频 | 超级碰碰碰视频 | 一区二区视频电影在线观看 | 97色狠狠| 国产在线中文字幕 | 毛片视频网址 | 免费a级毛片在线看 | 九色最新网址 | 国产精品久久久久久a | 欧美成人日韩 | 夜夜天天干| 中文字幕在线不卡国产视频 | 国内一级片在线观看 | 国产精品成人av电影 | 91九色蝌蚪视频在线 | 国产成人精品一区二区三区网站观看 | 色综合www | 久久久久亚洲国产精品 | 国产综合激情 | 国产无套精品久久久久久 | 国产精品自产拍在线观看中文 | 激情综合久久 | 天天天色综合 | 免费看片网页 | 这里只有精品视频在线 | 91精品视频导航 | 黄色特级一级片 | 黄色不卡av | 久久午夜视频 | 国产一级在线观看视频 | 福利区在线观看 | 欧美一级艳片视频免费观看 | 久久久久久久久久久久久9999 | 色多视频在线观看 | 亚洲激情 欧美激情 | 日韩亚洲在线 | 成人在线视频免费看 | 人人盈棋牌 | 91视频在线观看免费 | 国产欧美日韩一区 | 欧美日韩性视频 | 亚洲狠狠丁香婷婷综合久久久 | 国产欧美综合在线观看 | 97av影院| 在线最新av| av免费试看 | 99久久99久久精品国产片 | 成人综合婷婷国产精品久久免费 | 在线看不卡av | 欧美91片 | 亚洲国产精品第一区二区 | 在线免费av观看 | av免费福利| 91精品国产91久久久久福利 | 五月天婷婷在线观看视频 | 国产国产人免费人成免费视频 | 免费网址在线播放 | 91经典在线| 国产在线精品二区 | 在线 国产 亚洲 欧美 | 人人干天天射 | 国产精品mm| 国产成人精品国内自产拍免费看 | 亚洲免费av在线播放 | 国产精品婷婷 | 日本资源中文字幕在线 | 激情中文字幕 | 日韩电影一区二区在线 | 国产又粗又猛又爽又黄的视频先 | 亚洲国产成人在线播放 | 九九九九热精品免费视频点播观看 | 超黄视频网站 | 免费亚洲视频在线观看 | 男女免费视频观看 | 亚洲视频资源在线 | 一区二区中文字幕在线播放 | 国产a级精品 | 一区二区三区四区五区六区 | 天天射射天天 | 少妇18xxxx性xxxx片 | 久久精品男人的天堂 | 亚洲视屏在线播放 | 免费视频资源 | 五月天丁香综合 | 丁香六月在线 | 五月天综合激情网 | 色婷婷成人 | 9999亚洲 | 午夜国产福利在线 | 久久精品3| 日韩欧美在线观看 | 一区二区三区在线视频111 | 国产成人精品一区二区三区在线观看 | 美女啪啪图片 | 91精品人成在线观看 | 久草国产视频 | 久久国产a| 国产亚洲精品久久久久久久久久久久 | 韩国av免费在线 | 免费观看十分钟 | 国产不卡精品 | 91伊人久久大香线蕉蜜芽人口 | 久射网| 国产精品白虎 | 亚洲黄色免费电影 | 亚洲国产97在线精品一区 | 91精品国产综合久久福利 | 美女视频黄在线 | 不卡视频在线 | av在线一二三区 | 91av在| 日韩二区三区在线观看 | 国产精品一区二区三区在线免费观看 | 日韩在线电影 | 久草av在线播放 | 99 久久久久 | 成人在线视频免费 | 成人a毛片| 六月丁香激情网 | 亚洲精品一区二区18漫画 | 色综合咪咪久久网 | 国产一区在线观看免费 | 最近日本韩国中文字幕 | 国产字幕在线播放 | 久久久精品免费看 | 精品一区 在线 | 欧美色图视频一区 | a级免费观看 | 91九色porny在线 | 美女在线观看av | 亚洲精品乱码久久久久久按摩 | 91爱看片| 精品国产1区 | 国产在线观看地址 | 国产国语在线 | 99久久久久久国产精品 | 久久成人资源 | 在线观看一区二区精品 | 国产精品久久久久久影院 | 特级西西www44高清大胆图片 | 免费黄色av片 | 美女视频黄免费网站 | 中文亚洲欧美日韩 | 四虎影视成人永久免费观看亚洲欧美 | 色久av | 在线a亚洲视频播放在线观看 | 黄色综合| 黄色91在线| 日韩毛片在线一区二区毛片 | 2019久久精品 | 2023av| 免费视频二区 | 国产精品区一区 | 亚洲男男gaygay无套 | 免费av大全 | 日韩午夜精品福利 | www天天操| 久久久久久久久久亚洲精品 | 二区三区毛片 | 中文字幕一区二区三区在线视频 | 亚洲国产精品久久久久久 | 91自拍视频在线观看 | 精品久久1 | 国精产品一二三线999 | 国产精品女同一区二区三区久久夜 | 女人18精品一区二区三区 | 中文字幕在线看视频国产中文版 | 日本视频网 | 99国产视频| av电影亚洲 | 亚洲人成综合 | 成人av网站在线观看 | 日韩最新在线视频 | 美女在线免费视频 | 婷婷久久综合九色综合 | 丰满少妇在线观看 | 日韩免费电影一区二区三区 | 在线综合 亚洲 欧美在线视频 | 亚洲成熟女人毛片在线 | 麻豆国产网站 | 久久久久国产精品一区 | 91豆花在线观看 | 日韩免费观看高清 | 丁香视频全集免费观看 | 在线看日韩 | 免费看三级网站 | 日韩av在线一区二区 | 国产 一区二区三区 在线 | 久久精品人人做人人综合老师 | 欧美日韩精品区 | 亚洲成人精品国产 | 久久人人爽人人 | 国产精品video | 久久综合亚洲鲁鲁五月久久 | 日韩av电影免费观看 | 狠狠色丁香婷婷综合久久片 | 亚洲国产影院av久久久久 | 日韩在线观看影院 | 日韩高清黄色 | 99精品国产在热久久下载 | 97天堂网 | 西西444www大胆无视频 | 日韩在线观看第一页 | 精品在线不卡 | 亚洲精品玖玖玖av在线看 | 欧美与欧洲交xxxx免费观看 | 日韩区在线观看 | 国产亚洲情侣一区二区无 | 99精品视频免费观看视频 | 激情五月***国产精品 | 欧美久久久久久久 | 精品资源在线 | 色噜噜噜噜 | 色多多污污在线观看 | 国产在线中文字幕 | 在线电影播放 | 99久久精品免费看国产免费软件 | av在线一级 | 97超碰中文 | 91成人网页版 | 国产三级精品三级在线观看 | 亚洲专区路线二 | 黄色网大全 | 精品国自产在线观看 | 99在线热播精品免费99热 | 成人一区二区在线观看 | 国产无限资源在线观看 | 免费黄色小网站 | 欧美亚洲另类在线视频 | 国产群p视频| 亚洲免费在线视频 | 婷婷丁香av | 狠狠干在线播放 | 国产日韩欧美在线免费观看 | 欧美国产一区二区 | 综合网在线视频 | 久久久国产影视 | 欧美日本不卡高清 | 欧美激情另类 | 欧美久久影院 | a视频在线播放 | 欧美精品少妇xxxxx喷水 | 精品一二三四视频 | 男女啪啪网站 | 亚洲视频高清 | 国产在线成人 | 婷婷色中文字幕 | 国产色婷婷精品综合在线手机播放 | 色噜噜在线观看视频 | 国产视频日韩视频欧美视频 | 91亚洲精品国偷拍自产在线观看 | 免费视频成人 | 人人看人人爱 | 久久a久久 | 精品久久综合 | 最新av电影网站 | www色com| 色综合久久久 | 日韩视频一区二区在线 | 久久99精品久久久久婷婷 | 天天激情 | 天天操欧美 | 成人在线视频一区 | 黄网站免费大全入口 | 久久久天堂| 成人在线免费小视频 | 日韩啪啪小视频 | 成人黄色毛片 | 99视频在线观看免费 | 成年人免费看片 | 国产精品一区二区在线观看免费 | 欧美成人按摩 | 国产在线观看高清视频 | av超碰免费在线 | 精品美女久久 | 久久婷婷国产色一区二区三区 | 色在线中文字幕 | 日韩激情三级 | 国产精品青青 | 成人91在线 | 91精品爽啪蜜夜国产在线播放 | 五月开心六月伊人色婷婷 | 久久久久观看 | 人人舔人人爽 | 亚洲综合国产精品 | 欧美va电影 | 久久视频国产精品免费视频在线 | 黄色h在线观看 | 久久免费视频1 | 久久高清精品 | 精品久久久久久久久久久久久久久久久久 | 狠狠狠狠狠狠天天爱 | 超碰国产人人 | 久久久久久久久久久国产精品 | 玖玖玖在线观看 | 少妇18xxxx性xxxx片 | 久草在线久草在线2 | av先锋中文字幕 | 国产69久久精品成人看 | 免费午夜视频在线观看 | 欧美激情va永久在线播放 | 亚洲视频大全 | 日本精品久久久久中文字幕 | 在线视频国产区 | 中文字幕免费成人 | 欧美精品三级在线观看 | 中文字幕欧美三区 | 国产视频午夜 | 国产精品18久久久 | 69欧美视频 | 久久久久久久久爱 | 精品国产一二三 | 狠狠狠狠狠狠狠 | 婷婷新五月 | 亚洲理论电影 | 一二三久久久 | 国产操在线 | 国产精品一级视频 | 国产精品网站一区二区三区 | 99久久综合狠狠综合久久 | 成人欧美在线 | 美女福利视频一区二区 | 国产精品久久久久9999吃药 | 免费在线精品视频 | 黄色精品网站 | 中文字幕在线播放第一页 | 激情伊人 | 日韩视频一区二区三区 | 91毛片在线 | 天天草夜夜 | 日韩91在线 | 欧美精品乱码久久久久久按摩 | 18岁免费看片 | 婷婷精品国产欧美精品亚洲人人爽 | 在线成人免费 | 欧美亚洲xxx | 日韩| 在线观看日本高清mv视频 | 久久久免费观看 | 96av视频| 六月色| 日本三级在线观看中文字 | www.777奇米| 97福利在线观看 | 91片黄在线观看 | 天天操天操 | 色香蕉视频 | 国产色a在线观看 | 国产原创在线 | 久久a热6| 五月婷视频 | 一级黄色片网站 | 国产一级不卡毛片 | av动图| 午夜av在线播放 | 午夜精品福利在线 | 日韩在线视频一区 | 久久久久久影视 | 国产又黄又爽无遮挡 | 久久久久久国产一区二区三区 | 国产亚洲视频系列 | 色婷婷国产在线 | 99性视频 | 国产人成在线观看 | 8x成人免费视频 | 最新日韩视频 | 乱男乱女www7788 | 日本丰满少妇免费一区 | 99免费在线观看视频 | 国产一级在线看 | 99精品视频免费看 | 性色va | 在线观看亚洲a | 日本精品久久久久影院 | 亚洲精品中文字幕在线观看 | 国产综合激情 | 99国产精品一区二区 | 麻豆传媒一区二区 | 亚洲亚洲精品在线观看 | 日韩在观看线 | 精品免费一区二区三区 | 不卡国产在线 | 99久热在线精品视频观看 | www免费| 久久精品国产亚洲 | 久久高清视频免费 | 欧美日韩在线观看一区二区 | 欧美精品生活片 | 日韩精品中文字幕在线播放 | 国产麻豆剧果冻传媒视频播放量 | 国产精品久久久久毛片大屁完整版 | 精品一区二区亚洲 | 国产专区欧美专区 | 国产麻豆果冻传媒在线观看 | 日韩欧美网站 | 亚洲视频在线观看免费 | 久久久久国产免费免费 | 国产视频精品免费播放 | 欧美精品久久久久久久亚洲调教 | 夜夜夜 | 亚洲综合网| 激情伊人 | 免费观看性生交大片3 | 中文字幕成人在线 | 四虎国产精品免费观看视频优播 | 91视频在线观看下载 | 丁香激情视频 | 日日干干夜夜 | 91高清免费 | 日本精品一区二区 | 丁香婷婷激情 | 日本精品久久久久久 | 天堂va在线高清一区 | 久久亚洲免费视频 | 黄色高清视频在线观看 | 日韩精品欧美一区 | 国产精品久久久久久五月尺 | 国产人成看黄久久久久久久久 | 亚洲欧美综合精品久久成人 | 99精品视频免费在线观看 | 91在线免费播放 | 国产精品麻豆三级一区视频 | 99热这里精品 | 狠狠干干| 国产在线观看污片 | 国产精品一区二区av影院萌芽 | 九九九视频精品 | av解说在线 | 在线观看视频一区二区三区 | 亚洲永久精品在线观看 | 91av成人| 婷婷免费在线视频 | www.国产视频 | 国产高清免费在线观看 | 久久综合九色综合97_ 久久久 | 9999精品视频 | 国产美女视频一区 | 93久久精品日日躁夜夜躁欧美 | 国产一区二区在线观看视频 | 亚洲精品影视 | 天天操天天操天天操天天操天天操 | 国产成人综合图片 | 久久99亚洲精品久久久久 | 91在线观看视频网站 | 亚洲日本精品 | 瑞典xxxx性hd极品 | 99在线精品视频 | av网在线观看 | 中文字幕在线不卡国产视频 | 久久久久久国产一区二区三区 | 成人免费视频网站 | 特黄色大片 | 天天久久综合 | 国产原创中文在线 | 丰满少妇高潮在线观看 | 国产精品观看在线亚洲人成网 | 91视频黄色 | 天天透天天插 | 久草免费在线视频 | 亚洲永久精品视频 | 美女视频免费一区二区 | 久久久国产精品视频 | 日韩精品一区二区在线观看视频 | 国产精品毛片久久蜜 | 欧美成年人在线观看 | 午夜精品福利在线 | 有码视频在线观看 | 91在线国产观看 | 日韩高清久久 | 18国产精品白浆在线观看免费 | 99久久99久久精品国产片果冰 | 欧美日韩另类视频 | 福利电影久久 | 国产在线欧美在线 | 波多野结衣在线视频一区 | 中文字幕欧美三区 | 在线免费av电影 | 国产九色在线播放九色 | 500部大龄熟乱视频使用方法 | 99精品国产一区二区三区不卡 | 国产专区视频在线 | 日韩av成人在线观看 | 中中文字幕av | 久久婷婷视频 | 一区二区三区精品在线视频 | 国产99久久久精品视频 | 人人爱爱| 亚洲一级片在线看 | av一区二区三区在线 | 色综合天天在线 | 久久久www成人免费精品 | 久久经典视频 | 国产精品18久久久久vr手机版特色 | 亚洲国产精品99久久久久久久久 | 探花视频免费在线观看 | 欧美成年人在线视频 | 在线国产一区二区三区 | 五月天激情婷婷 | 亚洲最大的av网站 | 91精选在线 | 怡春院av | 香蕉视频在线观看免费 | 曰本三级在线 | 黄色三级网站在线观看 | 国产精品免费视频一区二区 | 久久免费a | 91在线一区二区 | 成人超碰97| 黄色免费在线视频 | 日韩电影黄色 | 久久国产精品成人免费浪潮 | 亚洲丁香久久久 | 欧美日韩一区二区三区在线观看视频 | 在线观看成人网 | 精品一区免费 | 国产美女在线观看 | 91免费日韩| 国产一区二区网址 | 免费看一及片 | 色噜噜狠狠色综合中国 | 久久久久久久久毛片精品 | 国产裸体bbb视频 | 久久综合之合合综合久久 | 福利在线看片 | 色播激情五月 | 色视频在线看 | 五月婷婷香蕉 | 久久天天躁夜夜躁狠狠85麻豆 | 中文字幕乱码亚洲精品一区 | 日日夜夜骑 | 99久久综合国产精品二区 | 国产视频精品免费播放 | 婷婷久月 | 国产精品久一 | 中文字幕乱码在线播放 | 久久96国产精品久久99软件 | 国产精品一区二区免费在线观看 | 国产成人在线播放 | 狠狠操天天操 | av中文在线| 色婷婷国产在线 | 婷婷五天天在线视频 | 婷婷色资源 | 91在线看片| 免费观看91视频大全 | 日本中文字幕在线视频 | 免费a视频在线 | 国产精品理论片在线观看 | 亚洲视频中文 | 操操操日日日 | 久草在线中文888 | avcom在线| 国内偷拍精品视频 | 亚洲综合网 | 亚洲欧洲成人精品av97 | 九九交易行官网 | 久久久久久毛片精品免费不卡 | 国产小视频你懂的在线 | 777xxx欧美| 九九欧美 | 久久久99精品免费观看app | 91视频三区 | 国产欧美精品一区二区三区四区 | 91香蕉嫩草| 欧美性大战 | 亚洲最快最全在线视频 | 国产成人综合图片 | 日韩在线激情 | 亚洲视频每日更新 | 欧美性免费 | 蜜桃视频日韩 | 色婷婷欧美 | 又黄又爽的视频在线观看网站 | 91超级碰 | 国产精品久久久久婷婷二区次 | 亚洲电影第一页av | 999久久久免费视频 午夜国产在线观看 | 中文字幕在线视频网站 | 免费看一级特黄a大片 | 亚洲aⅴ免费在线观看 | 国产大陆亚洲精品国产 | 国产精品欧美日韩 | 亚洲精品66 | 人人爽人人爽人人片 | 日韩a在线 | 免费在线观看av网址 | 在线视频欧美日韩 | 91麻豆精品91久久久久同性 | 911香蕉| 日韩欧美在线第一页 | 国产精品一区二区三区在线播放 | 狠狠干综合 | 国产高清不卡一区二区三区 | 日日夜夜干 | 久久综合影院 | 黄色福利网 | 中文字幕日本在线 | 国产精品久久久久久久久费观看 | 在线免费观看麻豆视频 | 久久久国产电影 | 国产精品久久久久久久久免费看 | 黄色亚洲免费 | 国产中文字幕第一页 | av资源免费观看 | 91| 国产高清视频免费观看 | www一起操| 亚洲aⅴ在线 | 亚洲va在线va天堂 | 中文字幕在线观看国产 | 国产爽妇网 | 色99久久 | 超碰在线中文字幕 | 国产在线精品一区二区不卡了 | 国产精品毛片一区二区在线看 | 成人福利av| 国产亚洲精品bv在线观看 | 精品国产理论片 | 国产一在线精品一区在线观看 | 国产精品成人自产拍在线观看 | 999国产精品视频 | 婷婷五天天在线视频 | 四虎在线永久免费观看 | 国产一级黄色免费看 | 在线观看视频你懂得 | 黄色aa久久 | 精品国产伦一区二区三区观看方式 | 国内精品久久久久久久97牛牛 | 久久69精品 | 亚洲在线高清 | 久久国产精品视频 | 国产精品综合久久久 | 99免费在线视频观看 | 婷婷色视频 | 亚洲成a人片在线www | 国产一区二区精 | 国产视频一区精品 | 婷婷综合五月天 | 国产一区二区中文字幕 | 六月激情 | 中文字幕九九 | 精品久久1 | 久久精品美女视频 | 91视频网址入口 | 婷婷色av | 国产原创在线 | 91在线视频导航 | 美女一级毛片视频 | 亚洲最新av在线网址 | 娇妻呻吟一区二区三区 | 国产日韩欧美在线影视 | 国产精品大片在线观看 | 一区二区三区在线播放 | 国产在线探花 | 操操操日日 | 人人爽人人爽人人片 | 久久五月精品 | 国产精品涩涩屋www在线观看 | 中国黄色一级大片 | 日日夜夜人人精品 | 国产又粗又猛又爽又黄的视频先 | 亚洲 欧洲av | 久久久999精品视频 国产美女免费观看 | 亚洲视屏在线播放 | 国产91精品高清一区二区三区 | 97在线视频免费观看 | 国产色视频网站 | 日韩美视频 | 正在播放五月婷婷狠狠干 | 在线看片a| 91看成人 | 国产成人精品国内自产拍免费看 | 色噜噜日韩精品一区二区三区视频 | 中国一级特黄毛片大片久久 | 欧美一区二区伦理片 | 99爱视频在线观看 | av一级片 | 91精品视频免费 | 天天玩夜夜操 | 丁香免费视频 | 欧美日韩高清在线一区 | 狠狠干天天操 | 亚洲黄色大片 | 免费三级黄 | 黄色亚洲大片免费在线观看 | 国产成人精品久久二区二区 | 天天操天天曰 | 天天射网 | 国产精品video爽爽爽爽 | 在线观看韩国av | 精品久久久久久久久久久久久久久久久久 | 色亚洲网| 久久综合亚洲鲁鲁五月久久 | 高清不卡免费视频 | 美女中文字幕 | 五月天色站 | 五月婷婷色 | 黄免费网站 | 成人精品视频久久久久 | 韩国av电影网 | 日韩大片免费观看 | 黄色网在线免费观看 | www激情com| 亚洲一区二区视频在线播放 | av导航福利 | 婷婷丁香狠狠爱 | 久久国产乱 | 日韩成人一级大片 | 久久综合精品一区 | 麻豆视频免费入口 | 一级黄色大片 | 亚洲一区二区视频在线 | 97超碰精品 | 在线观看黄色免费视频 | 手机av看片 | 天天干 天天摸 天天操 | 久久日本视频 | 国产精品久久久久一区 | 中文字幕在线免费看 | 99久久综合精品五月天 | 免费电影一区二区三区 | 日本精品视频在线播放 | 国内免费久久久久久久久久久 | 西西4444www大胆无视频 | 三级大片网站 | 亚洲首页| 97免费| 国产精品久久久久久久婷婷 | 国产视频精品在线 | 91在线最新| 国产综合激情 | 国产69精品久久久久久 | 国产这里只有精品 | 免费a网| 在线免费看黄色 | 日精品 | 国产精品成人自产拍在线观看 | 欧美日产在线观看 | 亚洲激情影院 | av成人在线观看 | 九九视频免费观看视频精品 | 久久久久免费网 | 少妇高潮冒白浆 | 亚洲国产精久久久久久久 | 免费中文字幕 | 六月天综合网 | 欧美aⅴ在线观看 | 久久免费视频在线 | 中文字幕免费看 | 亚洲日本色 | 国产精品一区二区三区在线看 | 成人免费视频视频在线观看 免费 | 久久字幕精品一区 | 久久久黄色免费网站 | 免费黄色在线网址 | 九草视频在线观看 | 久久人人爽视频 | 成人免费网站视频 | 婷婷综合在线 | 久久国产精品成人免费浪潮 | 伊人超碰在线 | 国产二区av | 国内精品久久天天躁人人爽 | 久久久久综合精品福利啪啪 | 日韩精品一区电影 | 亚洲高清在线观看视频 | 最新影院 | 天天操夜夜拍 | av中文字幕第一页 | 国产精品自产拍在线观看中文 | 精品国内自产拍在线观看视频 | 最新影院 | 日韩一区正在播放 | 亚洲另类视频在线观看 | 久久天天综合网 | 国产剧情一区二区在线观看 | 国产99一区 | 国产高清在线免费 | 日韩免费电影 | 最近日韩中文字幕中文 | 在线观看视频一区二区三区 | 久久久久国产精品一区二区 | 日韩最新中文字幕 | 日韩理论电影在线观看 | 久久综合色影院 | av观看在线观看 | 成人黄色片免费看 | 久久精品导航 | 婷婷av网站 | 国产综合小视频 | 中文字幕综合在线 | 99色婷婷| 欧美a影视 | 激情五月综合 | 在线观看午夜 | 中文字幕久久精品亚洲乱码 | 久久久久亚洲国产精品 | 国产亚洲精品女人久久久久久 | 四虎在线免费观看 | 激情五月婷婷激情 | 免费观看成人av | 久久天天拍 | 亚洲午夜小视频 | 91中文字幕在线视频 | 免费观看黄 | 在线观看成人福利 | 亚洲永久在线 | 黄色av网站在线观看 | 99久精品视频 | 天天综合网天天 | 三级午夜片 | 婷婷激情五月综合 | 日韩一级精品 | 91成人精品一区在线播放69 | 亚洲精品国产精品国自产观看浪潮 | 日韩黄色免费看 | 国产高清在线免费观看 | 欧美色黄 | 成人天堂网 | 五月天综合色激情 | 日韩精品视频免费专区在线播放 | 国产麻豆精品久久 | 免费高清在线观看电视网站 | 天堂在线一区二区 | 看片一区二区三区 | www.综合网.com | 久久99国产精品久久99 | 国产精品黑丝在线观看 | 网站免费黄色 | 最近更新的中文字幕 | 91麻豆精品国产自产在线游戏 | 欧美久久久久久久久久 | 中文字幕有码在线观看 | 免费成人在线视频网站 | 91视频链接 | 国产一区二区在线精品 | av成人在线电影 | 四虎影院在线观看av | 久久久久久久久久久久亚洲 | 97精品国产一二三产区 | 激情久久久久久久久久久久久久久久 | 国内三级在线 | 九九欧美视频 | 国产在线永久 | 亚洲国产精品va在线看 | 国产精品久久99综合免费观看尤物 | 国产免费久久av | 国产黄色在线看 | 在线www色 | 九九爱免费视频 | 播五月婷婷 | 又黄又爽又色无遮挡免费 | 久久久久福利视频 | 国内久久久久 | 久久久久五月天 | 国产 欧美 日本 | www.亚洲精品视频 | 国产精品一区久久久久 | 一区二区丝袜 | 四虎永久网站 | 三级黄色在线观看 | 九九九九九九精品 | 视频福利在线 | 在线观看久久久久久 | 久久久久国产精品厨房 | 综合色综合| 婷婷在线综合 | 欧美伦理一区二区 | 欧美成人h版在线观看 | 亚洲va在线va天堂 | 婷婷在线观看视频 | 中文字幕888 | 在线黄av | 精品久久一区 | 深夜福利视频在线观看 | 久久无码精品一区二区三区 | 欧美有色| 色综合五月天 | 国产成视频在线观看 | 亚洲国内精品视频 | 亚洲最大av网站 | 国产视频首页 | 色.com| 在线精品视频免费播放 | 亚洲成人av免费 | 亚洲精品在线观看视频 | 制服丝袜欧美 | 在线精品一区二区 | 色橹橹欧美在线观看视频高清 | 探花在线观看 | 色狠狠婷婷 | 日韩一区二区三区在线观看 | 国产在线观看91 | www.午夜| 少妇高潮流白浆在线观看 | 欧美一级日韩三级 | 超碰公开在线观看 | 国产精品二区在线观看 | 97热在线观看 | 国产精品久久久免费看 | 激情五月在线 | 亚洲天堂网站视频 | 最新成人av | 狂野欧美激情性xxxx | 亚洲电影成人 | 欧洲亚洲精品 | 国产很黄很色的视频 | 成人午夜在线观看 | 日韩精品在线观看av | 久久久久国产成人精品亚洲午夜 | 草在线视频 | 97超碰人人澡人人爱学生 | 精品久久久免费 | 91热在线 | 日韩女同一区二区三区在线观看 | 国产精品专区h在线观看 | 四虎成人网 | 麻豆91视频 | 国产一级电影网 | 国产精品中文字幕在线观看 | 亚洲成人av在线播放 | 九九免费精品视频在线观看 | 综合久久久久久久久 | 成人av电影免费在线观看 | 成人黄色片免费看 | а天堂中文最新一区二区三区 | 色视频在线 | 黄在线免费看 | 国内成人精品2018免费看 | 久久免费一 | 精品国产一区二区三区久久久蜜月 | 免费在线观看中文字幕 | 久久亚洲私人国产精品va | 永久免费的啪啪网站免费观看浪潮 | 中文字幕观看视频 | 伊人夜夜| 经典三级一区 | 视色网站| 波多野结衣电影一区二区三区 | 亚洲美女视频在线 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 国产精品久99 | 黄色成人在线观看 |