目前,IBM® DB2® Universal Database™(DB2 UDB)至少支持 25 種表或表空間狀態。這些狀態在某些情況下被用來控制對數據的訪問,或者在必要時被用來引出特定用戶動作,以保護數據庫的完整性。大多數狀態產生於與某個 DB2 實用程序的操作相關的事件,例如加載實用程序,或者備份和恢復實用程序。
本文描述了每個受支持的表或表空間狀態(見表 1;單擊狀態名跳至其描述,該描述位於後面的某個表中)。本文還提供了一些工作示例,以便准確地展示如何解釋和響應管理數據庫時可能碰到的狀態。這些示例取自於 AIX® 上運行的命令腳本;您可以復制、粘貼並親自運行它們。如果您在非 UNIX® 的系統上運行 DB2 UDB,請確保所有的路徑名都是適合系統的正確格式。大多數示例都是以 SAMPLE 數據庫中的表為基礎的,該數據庫是 DB2 UDB 附帶的。也存在少數需要 SAMPLE 數據庫中沒有包含的場景的情況,但是,您可以將到 SAMPLE 數據庫的連接用作為一個起始點。
表 2 和表 3 中描述了這些狀態。 表 2描述了受支持的表空間狀態,而 表 3 則描述了目前支持的表狀態。
表 1. 到版本 8.1.4 為止的 DB2 UDB 所有支持版本中定義的表和表空間狀態
狀態 范圍 狀態 范圍 Backup Pending 表空間 QuIEsced Update 表空間 Backup in Progress 表空間 Read Access Only 表 Check Pending 表 Reorg in Progress 表空間 DMS Rebalance in Progress 表空間 Restore Pending 表空間 Disable Pending 表空間 Restore in Progress 表空間 Drop Pending 表空間 Roll Forward Pending 表空間 Load Pending 表 Roll Forward in Progress 表空間 Load in Progress 表空間或 表 Storage May be Defined 表空間 Normal 表空間或 表 Storage Must be Defined 表空間 Not Load Restartable 表 Table Space Creation in Progress 表空間 Offline and Not Accessible 表空間 Table Space Deletion in Progress 表空間 QuIEsced Exclusive 表空間 Unavailable 表 QuIEsced Share 表空間
表空間狀態
db2tbst 命令接收十六進制的狀態值,並返回相應的表空間狀態(參見圖 1)。例如,命令 db2tbst 0x0008 返回 State = Load Pending 。而該十六進制的狀態值反過來又是 LIST TABLESPACES 命令輸出的組成部分(參見圖 2)。
圖 1. db2tbst 命令接收十六進制的表空間狀態值並返回其狀態。
表空間的外部可見狀態是由單個狀態值的十六進制總和構成的。例如,如果表空間的狀態是 Backup Pending和 Load in Progress,那麼所返回的十六進制值就是 0x20020(0x00020 + 0x20000)。本例中,命令 db2tbst 0x20020 返回:
State = Backup Pending
+ Load in Progress
圖 2. 可以使用 LIST TABLESPACES 命令確定連接數據庫中表空間的當前狀態。
表 2. 受支持的表空間狀態
狀態
十六進制狀態值
描述
示例
Backup Pending
0x20
在執行指定時間點的(point-in-time)表空間前滾操作之後,或者在執行指定了 COPY NO 選項的 LOAD 操作(針對可恢復的數據庫)之後,表空間處於這種狀態。在使用該表空間之前,必須備份該表空間(或者是整個數據庫)。如果沒有備份這個表空間,那麼只能對其中包含的表進行查詢,而無法更新它們。注意:在啟用數據庫進行前滾恢復之後,還必須立即對該數據庫進行備份。如果 logretain數據庫配置參數被設為 RECOVERY,或者 userexit數據庫配置參數被設為 YES,那麼該數據庫是可恢復的。直到對這樣的數據庫進行了備份,您才可以連接它。備份後, backup_pending數據庫配置參數會被設為 NO。
1. 已知載入的輸入文件 staff_data.del 具有以下內容: 11,"Melnyk",20,"Sales",10,70000,15000:
update db cfg for sample using logretain recovery;
backup db sample;
connect to sample;
load from staff_data.del of del messages load.msg insert into staff copy no;
update staff set salary = 69000 where id = 11;
2.update db cfg for sample using logretain recovery;
connect to sample;
Backup in Progress
0x800
這是一種只在進行備份操作期間才有效的臨時狀態。
執行一條在線 BACKUP DATABASE 命令:
backup db sample online;
在執行備份操作時,通過另一個會話執行下列腳本:
connect to sample;
1.list tablespaces show detail; 或者
2.get snapshot for tablespaces on sample;
connect reset;
USERSPACE1 返回的信息顯示,該表空間處於 Backup in Progress 狀態。
DMS Rebalance in Progress
0x10000000
這是一種只在執行數據重新平衡操作期間才有效的臨時狀態。當向定義為數據庫管理空間(DMS)的表空間添加新的容器時,或者當擴展現有的容器時,就可能發生表空間數據的重新調整。 重新調整(Rebalancing)是指將表空間區段(extent)從某一位置移動到另一位置,試圖保持數據成一整塊的過程。一個 區段(extent)就是一個容器空間單元(以頁面為單位),而一個 條帶(stripe)就是用於表空間的 跨容器集的一層區段。
已知載入的輸入文件 staffdata.del 擁有大量數據(例如,20000 條或更多記錄):
connect to sample;
create tablespace ts1 managed by database using (file '/home/melnyk/melnyk/NODE0000/SQL00001/ts1c1' 1024);
create table newstaff like staff in ts1;
load from staffdata.del of del insert into newstaff nonrecoverable;
alter tablespace ts1 add (file '/home/melnyk/melnyk/NODE0000/SQL00001/ts1c2' 1024);
list tablespaces;
connect reset;
TS1 返回的信息顯示,該表空間處於 DMS Rebalance in Progress 狀態。
Disable Pending
0x200
在執行數據庫前滾操作期間,表空間可能處於這種狀態,但在前滾操作結束之時,就不應再處於該狀態。當出現表空間脫機以及對沒有被寫入硬盤的事務補償日志記錄時,就可能觸發這種狀態。該表空間狀態的出現以及隨後狀態的消失對用戶都是透明的。
至於說明該表空間狀態的示例,已經超出了本文的范圍。
Drop Pending
0x8000
在重新啟動數據庫時,如果發現該數據庫的一個或多個容器有問題,那麼表空間就會處於這種狀態。(如果數據庫的前一會話異常終止,例如停電時,就必須重新啟動數據庫。)如果表空間處於 Drop Pending 狀態,就不再可用,只能將其刪除。
至於說明該表空間狀態的示例,已經超出了本文的范圍。
Load in Progress
0x20000
這是一種只在執行指定了 COPY NO 選項的載入操作(針對可恢復的數據庫)時才有效的臨時狀態。
已知載入的輸入文件 staffdata.del 有大量數據(例如,20000 條或更多記錄):
update db cfg for sample using logretain recovery;
connect to sample;
load from staffdata.del of del insert into newstaff copy no;
在執行載入操作時,從另一會話執行下列腳本:
connect to sample;
list tablespaces;
connect reset;
Information returned for USERSPACE1 返回的信息顯示,該表空間處於 Load in Progress(和 Backup Pending)狀態。
Normal
0x0
如果表空間不是處於任何其他(異常的)表空間狀態,那麼該表空間的狀態就為 Normal 狀態。Normal 狀態是表空間被創建之後的初始狀態。
connect to sample;
create tablespace ts1 managed by database using (file '/home/melnyk/melnyk/NODE0000/SQL00001/tsc1' 1024);
list tablespaces show detail;
Offline and Not Accessible
0x4000
如果表空間的一個或多個容器存在問題,那麼表空間就處於這種狀態。容器偶然可能會被重命名、移動或損壞。在該問題被糾正,且再次可以訪問與該表空間相關的容器之後,可以通過斷開數據庫與應用程序的連接,然後重新連接數據庫來消除該異常狀態。或者,您可以執行一條 ALTER TABLESPACE 語句,指定 SWITCH ONLINE 子句來消除表空間的 Offline and Not Accessible 狀態,從而無需斷開其他應用程序與該數據庫的連接。
connect to sample;
create tablespace ts1 managed by database using (file '/home/melnyk/melnyk/NODE0000/SQL00001/tsc1' 1024);
alter tablespace ts1 add (file '/home/melnyk/melnyk/NODE0000/SQL00001/tsc2' 1024);
export to st_data.del of del select * from staff;
create table stafftemp like staff in ts1;
import from st_data.del of del insert into stafftemp;
connect reset;
將表空間容器 tsc1 重新命名為 tsc3,然後嘗試查詢 STAFFTEMP 表:
connect to sample;
select * from stafftemp;
該查詢返回 SQL0290N(不允許訪問表空間),而 LIST TABLESPACES 命令返回 TS1 的狀態值 0x4000(Offline and Not Accessible)。將表空間容器 tsc3 再次命名為 tsc1。這一次,該查詢將運行成功。
QuIEsced Exclusive
0x4
當調用表空間靜默(quiesce)功能的應用程序獨占(讀或寫)訪問表空間時,該表空間就處於這種狀態。您可以通過執行一條 QUIESCE TABLESPACES FOR TABLE 命令,將表空間置於 QuIEsced Exclusive 狀態。
在將表空間設置為 QuIEsced Exclusive 之前,要確保它處於 Normal狀態。
connect to sample;
quIEsce tablespaces for table staff reset;
quIEsce tablespaces for table staff exclusive;
connect reset;
從另一會話執行下列腳本:
connect to sample;
select * from staff where id=60;
update staff set salary=50000 where id=60;
list tablespaces;
connect reset;
Information returned for USERSPACE1 返回的信息顯示,該表空間處於 QuIEsced Exclusive 狀態。
QuIEsced Share
0x1
當調用表空間靜默(quiesce)功能的應用程序和並發應用程序都可以讀(但不能寫)訪問表空間時,該表空間就處於這種狀態。您可以通過執行一條 QUIESCE TABLESPACES FOR TABLE 命令,將表空間顯式地置於 QuIEsced Share 狀態。
在將表空間設置為 QuIEsced Share 之前,要確保它處於 Normal狀態。
connect to sample;
quIEsce tablespaces for table staff reset;
quIEsce tablespaces for table staff share;
connect reset;
從另一會話執行下列腳本:
connect to sample;
select * from staff where id=40;
update staff set salary=50000 where id=40;
list tablespaces;
connect reset;
USERSPACE1 返回的信息顯示,該表空間處於 QuIEsced Share 狀態。
QuIEsced Update
0x2
當調用表空間靜默(quiesce)功能的應用程序獨占寫訪問表空間時,該表空間就處於這種狀態。您可以通過執行一條 QUIESCE TABLESPACES FOR TABLE 命令,將表空間顯式地置於 QuIEsced Update 狀態。
在將表空間設置為 QuIEsced Update 之前,要確保它處於 Normal狀態。
connect to sample;
quIEsce tablespaces for table staff reset;
quIEsce tablespaces for table staff intent to update;
connect reset;
從另一會話執行下列腳本:
connect to sample;
select * from staff where id=50;
update staff set salary=50000 where id=50;
list tablespaces;
connect reset;
USERSPACE1 返回的信息顯示,該表空間處於 QuIEsced Update 狀態。
Reorg in Progress
0x400
這是一種只在進行重組(reorg)操作期間才有效的臨時狀態。
執行一條 REORG TABLE 命令:
connect to sample;
reorg table staff;
connect reset;
在執行重組操作時,從另一會話執行下列腳本:
connect to sample;
1.list tablespaces show detail; 或者
2.get snapshot for tablespaces on sample;
connect reset;
USERSPACE1 返回的信息顯示,該表空間處於 Reorg in Progress 狀態。注意:涉及 SAMPLE 數據庫的表重組操作很可能在極短的時間內就可以完成,因此,使用這種方法來觀察 Reorg in Progress 狀態可能比較困難。
Restore Pending
0x100
在執行了重定向恢復操作的第一部分之後(即在發出 SET TABLESPACE CONTAINERS 命令之前),數據庫的表空間就處於這種狀態。在使用表空間之前,必須恢復表空間(或者是整個數據庫)。直到成功完成恢復操作,您才可以連接到數據庫,此時, restore_pending信息數據庫配置參數的值被設為 NO。
當處於 Storage May be Defined中的重定向恢復操作的第一部分完成時,所有的表空間都將處於 Restore Pending 狀態。
Restore in Progress
0x2000
這是一種只在執行恢復操作期間才有效的臨時狀態。
update db cfg for sample using logretain recovery;
backup db sample;
backup db sample tablespace (userspace1);
該備份映像的時間戳為:20040611174124
restore db sample tablespace (userspace1) online taken at 20040611174124;
在執行恢復操作時,從另一會話執行下列腳本:
connect to sample;
1.list tablespaces show detail; 或者
2.get snapshot for tablespaces on sample;
connect reset;
USERSPACE1 返回的信息顯示,該表空間處於 Restore in Progress 狀態。
Roll Forward Pending
0x80
在對可恢復的數據庫執行恢復操作之後,表空間就處於這種狀態。在使用表空間之前,必須前滾該表空間(或是整個數據庫)。如果 logretain數據庫配置參數被設為 RECOVERY,或者 userexit數據庫配置參數被設為 YES,那麼該數據庫是可恢復的。直到前滾操作成功完成,您才可以激活或連接到該數據庫,此時, rollfwd_pending信息數據庫配置參數被設為 NO。
當處於 Restore in Progress中的在線表空間完成恢復操作時,表空間 USERSPACE1 處於 Roll Forward Pending 狀態。
Roll Forward in Progress
0x40
這是一種只在執行前滾操作期間才有效的臨時狀態。
已知載入的輸入文件 staffdata.del 擁有大量數據(例如,20000 條或更多記錄):
update db cfg for sample using logretain recovery;
backup db sample;
connect to sample;
create tablespace ts1 managed by database using (file '/home/melnyk/melnyk/NODE0000/SQL00001/ts1c1' 1024);
create table newstaff like staff in ts1;
connect reset;
backup db sample tablespace (ts1) online;
該備份映像的時間戳為:20040630000715
connect to sample;
load from staffdata.del of del insert into newstaff copy yes to /home/melnyk/backups;
connect reset;
restore db sample tablespace (ts1) online taken at 20040630000715;
rollforward db sample to end of logs and stop tablespace (ts1) online;
當執行前滾操作時,從另一會話執行下列腳本:
connect to sample;
1.list tablespaces show detail; 或者
2.get snapshot for tablespaces on sample;
connect reset;
TS1 返回的信息顯示,該表空間處於 Roll Forward in Progress 狀態。
Storage May be Defined
0x2000000
在執行了重定向恢復操作的第一部分之後(即在發出 SET TABLESPACE CONTAINERS 命令之前),數據庫的表空間就處於這種狀態。如果您願意,這將允許您重新定義容器。
backup db sample;
假定該備份映像的時間戳為:20040613204955
restore db sample taken at 20040613204955 redirect;
list tablespaces;
Information returned by the LIST TABLESPACES 命令返回的信息顯示,所有的表空間都處於 Storage May be Defined 和 Restore Pending狀態。
Storage Must be Defined
0x1000
在將恢復操作重定向到 新數據庫期間,如果省略了設置表空間容器的階段,或者,如果在設置表空間容器的階段期間無法獲得指定的容器,那麼數據庫的表空間就會處於這種狀態。某些時候會出現後一種情況,例如,指定了無效的路徑名,或者是磁盤空間不足。
backup db sample;
假定該備份映像的時間戳為:20040613204955。
restore db sample taken at 20040613204955 into mydb redirect;
set tablespace containers for 2 using (path 'ts2c1');
list tablespaces;
LIST TABLESPACES 命令返回的信息顯示,表空間 SYSCATSPACE 和表空間 TEMPSPACE1 都處於 Storage Must be Defined、 Storage May be Defined和 Restore Pending狀態。Storage Must be Defined 狀態比 Storage May be Defined 狀態更重要。
Table Space Creation in Progress
0x40000000
這是一種只在執行創建表空間的操作期間才有效的臨時狀態。
connect to sample;
create tablespace ts1 managed by database using (file '/home/melnyk/melnyk/NODE0000/SQL00001/tsc1' 1024);
create tablespace ts2 managed by database using (file '/home/melnyk/melnyk/NODE0000/SQL00001/tsc2' 1024);
create tablespace ts3 managed by database using (file '/home/melnyk/melnyk/NODE0000/SQL00001/tsc3' 1024);
在執行創建表空間的操作時,從另一會話執行下列腳本:
connect to sample;
1.list tablespaces show detail; or
2.get snapshot for tablespaces on sample;
connect reset;
TS1、TS2 和 TS3 返回的信息顯示,這些表空間處於 Table Space Creation in Progress 狀態。
Table Space Deletion in Progress
0x20000000
這是一種只在執行刪除表空間的操作期間才有效的臨時狀態。
connect to sample;
create tablespace ts1 managed by database using (file '/home/melnyk/melnyk/NODE0000/SQL00001/tsc1' 1024);
create tablespace ts2 managed by database using (file '/home/melnyk/melnyk/NODE0000/SQL00001/tsc2' 1024);
create tablespace ts3 managed by database using (file '/home/melnyk/melnyk/NODE0000/SQL00001/tsc3' 1024);
drop tablespace ts1;
drop tablespace ts2;
drop tablespace ts3;
在執行刪除表空間的操作時,從另一會話執行下列腳本:
connect to sample;
1.list tablespaces show detail; 或者
2.get snapshot for tablespaces on sample;
connect reset;
TS1、TS2 和 TS3 返回的信息顯示,這些表空間處於 Table Space Deletion in Progress 狀態。
表狀態
DB2 UDB Version 8 load 實用程序通過表狀態(以及鎖)來獲取對表的訪問,並在執行載入操作時維護數據庫的一致性。即使載入操作發生了異常終止,表狀態也將會被保持。您可以用 LOAD QUERY 命令(見圖 3)確定特定表的狀態。LOAD QUERY 命令在其運行時檢查載入操作的狀態,並返回表的狀態。如果載入操作完成(或異常終止)了,那麼該命令只返回表的狀態。
圖 3. 可以使用 LOAD QUERY 命令來確定指定表的狀態。
雖然在載入操作之前,從屬的表空間不再是靜默的( quIEsce是一種持久性的鎖),但是 Load in Progress表空間狀態會在執行載入操作時阻止對從屬表進行備份。Load in Progress 表空間狀態不同於 Load in Progress 表空間狀態:所有的載入操作都使用 Load in Progress 表狀態,但是指定 COPY NO 選項的載入操作(針對可恢復的數據庫)還是使用 Load in Progress 表空間狀態。
一個表可以同時處於幾種狀態之下。例如,如果將數據載入定義了表檢查約束的表中,並指定 ALLOW READ ACCESS 選項,那麼在執行載入操作期間,該表就處於 Check Pending、 Load in Progress和 Read Access Only 狀態下。
表 3. 受支持的表狀態
狀態
描述
示例
Check Pending
如果在一個表上定義了表檢查約束,但還未驗證新數據與那些已定義約束的兼容性,那麼該表就處於這種狀態。例如,DB2 load 實用程序當開始在定義了表檢查約束的表上執行載入操作時,就將表的狀態設置為 Check Pending 狀態。如果想使該表恢復為 Normal狀態,則需要執行一條 SET INTEGRITY 語句。要想獲得更多的信息,請參閱 約束。
已知載入的輸入文件 staff_data.del 擁有以下內容: 11,"Melnyk",20,"Sales",10,70000,15000:
connect to sample;
alter table staff add constraint max_salary check (100000 - salary >0);
load from staff_data.del of del insert into staff;
load query table staff;
LOAD QUERY 命令返回的信息顯示,STAFF 表處於 Check Pending 狀態。
Load Pending
如果在可提交數據之前,表上的正在執行的載入操作被異常終止,那麼該表就處於這種狀態。若要使該表恢復 Normal狀態,則需要調用 load terminate、load restart 或 load replace 操作。
已知載入的輸入文件 staffdata.del 擁有大量數據(例如,20000 條或更多記錄),創建一個包含載入操作目標表的小型表空間,新建一個名為 NEWSTAFF 的表:
connect to sample;
create tablespace ts1 managed by database using (file '/home/melnyk/melnyk/NODE0000/SQL00001/ts1c1' 256);
create table newstaff like staff in ts1;
load from staffdata.del of del insert into newstaff;
load query table newstaff;
load from staffdata.del of del terminate into newstaff;
load query table newstaff;
connect reset;
LOAD QUERY 命令返回的信息顯示,NEWSTAFF 表處於 Load Pending 狀態;在執行 load terminate 操作之後,該表就重新處於 Normal狀態。
Load in Progress
這是一種只在執行載入操作期間才有效的臨時狀態。關於當載入操作失敗或被中斷時,如何解除表的 Load in Progress 狀態的信息,請參閱 IBM DB2 Universal Database Data Movement UtilitIEs Guide and Reference 中關於載入操作之後的暫掛狀態的小節。還請參閱 Load in Progress 表空間狀態。
已知載入的輸入文件 staffdata.del 擁有大量數據(例如,20000 條或更多記錄):
update db cfg for sample using logretain recovery;
backup db sample;
connect to sample;
create table newstaff like staff;
load from staffdata.del of del insert into newstaff copy no;
connect reset;
在執行載入操作時,從另一會話執行下列腳本:
connect to sample;
load query table newstaff;
connect reset;
LOAD QUERY 命令返回的信息顯示,NEWSTAFF 表處於 Load in Progress 狀態。
Normal
如果表不是處於任何其他(異常的)表狀態,那麼它就處於 Normal 狀態。Normal 狀態是表被創建之後的初始狀態。
connect to sample;
create table newstaff like staff;
load query table newstaff;
LOAD QUERY 命令返回的信息顯示,NEWSTAFF 表處於 Normal 狀態。
Not Load Restartable
當執行完前滾操作,接著出現一個失敗的載入操作,而該操作未被成功地重新啟動或者終止時,表就處於這種狀態。該表還將處於 Load Pending狀態。若要使該表恢復 Normal狀態,則需要執行一條 LOAD TERMINATE 命令。
已知載入的輸入文件 staffdata.del 擁有大量數據(例如,20000 條或更多記錄):
update db cfg for sample using logretain recovery;
backup db sample;
connect to sample;
create tablespace ts1 managed by database using (file '/home/melnyk/melnyk/NODE0000/SQL00001/ts1c1' 256);
create table newstaff like staff in ts1;
connect reset;
backup db sample;
該備份映像的時間戳為:20040629205935
connect to sample;
load from staffdata.del of del insert into newstaff copy yes to /home/melnyk/backups;
connect reset;
restore db sample taken at 20040629205935;
rollforward db sample to end of logs and stop;
connect to sample;
load query table newstaff;
connect reset;
LOAD QUERY 命令返回的信息顯示,NEWSTAFF 表處於 Not Load Restartable 和 Load Pending狀態。
connect to sample;
load from staffdata.del of del terminate into newstaff copy yes to /home/melnyk/backups;
load query table newstaff;
connect reset;
LOAD QUERY 命令返回的信息顯示,NEWSTAFF 表現在處於 Normal狀態。
Read Access Only
在執行載入操作時,如果指定了 ALLOW READ ACCESS 選項,那麼表就處於這種狀態。Read Access Only 是一個臨時狀態,它允許其他應用程序和實用程序讀訪問在執行載入操作 之前就存在的數據。
已知載入的輸入文件 staffdata.del 擁有大量數據(例如,20000 條或更多記錄):
connect to sample;
export to st_data.del of del select * from staff;
create table newstaff like staff;
import from st_data.del of del insert into newstaff;
load from staffdata.del of del insert into newstaff allow read Access;
在執行載入操作時,從另一會話執行下列腳本:
connect to sample;
load query table newstaff;
select * from newstaff;
connect reset;
LOAD QUERY 命令返回的信息顯示,NEWSTAFF 表處於 Read Access Only 和 Load in Progress狀態。該查詢返回 STAFF 表所導出的內容,以及在執行載入操作之前,就存在於 NEWSTAFF 表中的數據。
Unavailable
當前滾一個無法恢復的載入操作時,表就處於這種狀態;這樣的表只能被刪除,或者從備份映像恢復它。
已知載入的輸入文件 staff_data.del 擁有下列內容: 11,"Melnyk",20,"Sales",10,70000,15000:
update db cfg for sample using logretain recovery;
backup db sample;
該備份映像的時間戳為:20040629182012
connect to sample;
load from staff_data.del of del insert into staff nonrecoverable;
connect reset;
restore db sample taken at 20040629182012;
rollforward db sample to end of logs and stop;
connect to sample;
load query table staff;
connect reset;
LOAD QUERY 命令返回的信息顯示,STAFF 表處於 Unavailable 狀態。
結束語
DB2 UDB 用表狀態和表空間狀態來控制對數據的訪問,或者在特定情況下幫助保護數據庫的完整性。本文通過工作示例展示了可能引出特定狀態的更常見的一些條件,您可以用它們來識別哪些狀態是有效,以及如何作出正確響應,以便可以繼續使用數據,而不會出現漏拍(miss a beat)現象。您會很容易就適應這些示例,並將它們用到自己的數據中;很快,您將真正“感知到周圍的”各種狀態,並可使用它們來更好地理解數據庫的行為。