在PB使用中,發現個問題。sqlca大家都知道,是PB自帶的全域事務物件。但,如果使用自定義事務物件,不用sqlca,正常的使用DW控制元件去對資料庫操作,是沒問題。但直接寫sql,就出問題了。代碼段1的例:
SQLCA.DBMS = "O90 Oracle9i (9.0.1)"
SQLCA.LogPass = "ccmis"
SQLCA.ServerName = "orcl"
SQLCA.LogId = "ccmis"
SQLCA.AutoCommit = False
SQLCA.DBParm = "PBCatalogOwner='ccmis'"
connect using sqlca;
select s_ad282.nextval into :s_no from dual;
在這里,s_no是獲取記錄序列的值的。而采用自定義的事務物件
transaction gr2
gr2=create transaction
gr2.servername= "orcl"
gr2.logid="ccmis"
gr2.logpass= "ccmis"
gr2.dbparm= "PBCatalogOwner='ccmis'"
gr2.dbms= "O90 Oracle9i (9.0.1)"
gr2.autocommit=false
connect using gr2;
select s_ad282.nextval into :s_no from dual;
在這,s_no是空值。這是為什么呢???
前提,不要把這兩個事務寫在一個代碼段。connect using sqlca與connect using gr2如果寫在一起,是都能查出來結果的。因為connect using sqlca在發揮做用。 使用注釋的方法,就看出來了。代碼段1和自定義的代碼段,要試哪個,就注釋另外一組。
另外,就是使用自定義的事務物件,雖然不能執行PB中的嵌套sql陳述句,但卻可以通過dw正常完成增刪改查。
找高手求解
uj5u.com熱心網友回復:
用GR2的SQL,后面要加using rg2,
如,select s_ad282.nextval into :s_no from dual using rg2;
沒寫using 的,PB會自己幫你加上 using sqlca.
因為你的SQLCA沒CONNECT,所以查不到(你實際用到了sqlca.)
uj5u.com熱心網友回復:
事務處理簡介一、事務處理介紹
事務是這樣一種機制,它確保多個SQL陳述句被當作單個作業單元來處理。事務具有以下的作用:
* 一致性:同時進行的查詢和更新彼此不會發生沖突,其他用戶不會看到發生了變化但尚未提交的資料。
* 可恢復性:一旦系統故障,資料庫會自動地完全恢復未完成的事務。
二、事務與一致性
事務是完整性的單位,一個事務的執行是把資料庫從一個一致的狀態轉換成另一個一致的狀態。因此,如果事務孤立執行時是正確的,但如果多個事務并發交錯地執行,就可能相互干擾,造成資料庫狀態的不一致。在多用戶環境中,資料庫必須避免同時進行的查詢和更新發生沖突。這一點是很重要的,如果正在被處理的資料能夠在該處理正在運行時被另一用戶的修改所改變,那么該處理結果是不明確的。不加控制的并發存取會產生以下幾種錯誤:
1、丟失修改(lost updates)
當多個事務并發修改一個資料時,不加控制會得出錯誤的結果,一個修改會覆寫掉另一個修改。
2、讀的不可重復性
當多個事務按某種時間順序存取若干資料時,如果對并發存取不加控制,也會產生錯誤。
3、臟讀(DIRDY DATA),讀的不一致性
4、游標帶來的當前值的混亂
事務在執行程序中它在某個表上的當前查找位置是由游標表示的。游標指向當前正處理的記錄。當處理完該條記錄后,則指向下一條記錄。在多個事務并發執行時,某一事務的修改可能產生負作用,使與這些游標有關的事務出錯。
5、未釋放修改造成連鎖退出
一個事務在進行修改操作的程序中可能會發生故障,這時需要將已做的修改回退(Rollback)。如果在已進行過或已發現錯誤尚未復原之前允許其它事務讀已做過修改(臟讀),則會導致連鎖退出。
6、一事務在對一表更新時,另外的事務卻修改或洗掉此表的定義。
資料庫會為每個事務自動地設定適當級別的鎖定。對于前面講述的問題:臟讀、未釋放修改造成的連鎖退出、一事務在對一表更新時另外的事務卻修改或洗掉此表的定義,資料庫都會自動解決。而另外的三個問題則需要在編程程序中人為地定義事務或加鎖來解決。
三、事務和恢復
資料庫本身肩負著管理事務的責任。事務是最小的邏輯作業單元,在這個作業單元中,對資料庫的所有更新作業,要么必須全部成功,要么必須全部失敗(回退)。只要應用程式指定了某段程式為一個事務并做了相應的處理(提交或回退),資料庫系統會自動維護事務本身的特性。
四、ORACLE資料庫的事務定義
ORACLE事務從COMMIT、ROLLBACK、連接到資料庫或開始第一條可執行的SQL陳述句時開始,到一條COMMIT、ROLLBACK陳述句或退出資料庫時結束。如果在一個事務中包含DDL陳述句,則在DDL陳述句的前后都會隱含地執行COMMIT陳述句,從而開始或結束一個事務。
如果一個事務由于某些故障或者由于用戶改變主意而必須在提交前取消它,則資料庫被恢復到這些陳述句和程序執行之前的狀態。
利用ROLLBACK陳述句可以在COMMIT命令前隨時撤消或回退一個事務。可以回退整個事務,也可以會退部分事務,但是不能回退一個已經被提交的事務。回退部分事務的ROLLBACK命令為:ROLLBACK to savepoint 存盤點名存盤點是用戶放入事務中的標記,用來表示一個可被回退的位置。存盤點通過在事務中放入一個SAVEPOINT命令而被插入。該命令的語法是:SAVEPOINT 存盤點名如果在ROLLBACK陳述句中沒有給出存盤點名,則整個事務被回退。
五、SYBASE資料庫的事務定義
SYBASE通過使用BEGIN TRANsaction和COMMIT TRANsaction命令指示SQL將任意數目的陳述句作為一個單元來處理。ROLLBACK TRANsaction命令則允許用戶恢復到事務的開始,或恢復到事務內部已經被用SAVE TRANsaction命令定義的存盤點上。
BEGIN TRANsaction和COMMIT TRANsaction能夠包含任意數目的SQL 陳述句和存盤程序,方法很簡單:BEGIN TRANsaction [事務名稱] COMMIT TRANsaction 如果一個事務由于某些故障或者由于用戶改變主意而必須在提交前取消它,則資料庫被恢復到這些陳述句和程序執行之前的狀態。
利用ROLLBACK TRANsaction命令可以在COMMIT TRANsaction命令前隨時回退一個事務。可以回退整個事務,也可以回退部分事務,但是不能回退一個已經被提交的事務。ROLLBACK TRANsaction命令為:ROLLBACK TRANsaction [事務名|存盤點名] 存盤點名是用戶放入事務中的標記,用來表示一個可以被回退的位置。存盤點名通過在事務中放入一個SAVE TRANsaction命令而被插入。該命令的句法是: SAVE TRANsaction 存盤點名如果在ROLLBACK TRANsaction中沒有給出存盤點名或事務名,則事務被回退到批處理中的第一個BEGIN TRANsaction陳述句處。
經典的文章,關于事務!
并發能力是指多用戶在同一時間對相同資料同時訪問的能力。一般的關系型資料庫都具有并發控制的能力,但是這種并發功能也會對資料的一致性帶來危險。試想若有兩個用戶都試圖訪問某個銀行用戶的記錄并同時要求修改該用戶的存款余額時,情況將會怎樣呢?我們可以對PowerBuilder中的DataWindow進行設定來進行并發控制。所謂并發控制就是指在用戶資料修改的程序中保證該資料不被覆寫或改變的方式,在下面的例子中我們將看到如何設定DataWindow來控制開發訪問。為了說明問題,我們舉這樣一個簡單的銀行系統中的例子,某用戶的存款狀況如右:
我們假設事情的經過是這樣的:公司的某員工在銀行前臺取款2,000元,銀行出納查詢用戶的存款資訊顯示銀行存款余額20,000元;正在這時,另一銀行帳戶轉帳支票支付該帳戶5,000元,機器查詢也得到當前用戶存款20,000元,這時銀行的出納員看到用戶存款超過了取款額,就支付了客戶2,000元并將用戶存款改為18,000元,然后銀行的另一名操作員根據支票,將匯入的5,000元加上,把用戶的余額改為25,000元,那么資料庫管理系統是否可以接受這些修改呢?
在DataWindows的設計中,我們選擇選單Rows|Update…,會出現SpecifyUpdateCharacteristics的設定視窗,在這個視窗中我們設定Update陳述句中Where子句的生成,以此來進行開發控制。在這里有三個選項,我們分別看一看在本例中這三個選項的結果:
(1)Key Columns:生成的Where子句中只比較表中的主鍵列的值與最初查詢時是否相同來確定要修改的記錄。在上述的例子中,轉帳支票的操作將覆寫出納員作出的修改,這樣銀行損失兩千元。
(2)Key and Updateable Columns:生成的Where子句比較表中主鍵列和可修改列的值與最初查詢時否是相同。在上例中兩次查詢出的結果都是有兩萬余額,當第一個人修改余額時,余額仍是二萬元,所以修改成立,而支票轉帳操作時余額已不是二萬,所以該列不匹配,修改失敗。
(3)Key and Modified Columns:Where子句比較主鍵和將要修改的列,在本例中,結果與Key and Updateable Columns的選擇相同,因為余額已改變,不再與最初的查詢相同,因此仍然不能修改。
讓我們作另外一個假設,我們把銀行后臺作支票轉帳操作改為凍結用戶存款,即把狀態欄位的值改為凍結,而且事件發生的次序如下表,那么表中的次序4…前臺出納的修改能不能成立呢:
1.Key Columns:Where子句只比較主鍵值,顯然出納員的修改是允許的。
2.Key and Updateable Columns:生成的Where子句包括比較所有可修改的列,因此出納修改時Statue欄位為凍結與出納查詢時的tive不符,修改失敗,同時顯示錯誤資訊。
3.Key and Modified Columns:Where子句的比較包括主鍵和要修改的列,由于本列中修改列仍為20,000元沒有變化,所以出納的修改可以成立。
uj5u.com熱心網友回復:
在本例中,我們可以看到Key and Updateable Columns的選項最嚴格,可以避免出現狀態列發生改變時余額作修改的錯誤,但是這也會禁止我們作一些本當允許的并發修改,如出納修改存款余額,而業務員修改用戶的聯系地址等。因此我們應當根據實際情況,選擇適當的Update設定。根據我們使用資料庫的不同,我們還有一些其他的控制并發訪問和修改的選擇方案,如對資料加鎖。鎖是一個用戶避免其他用戶對指定行作修改的操作。在結束一個事務如執行commit,rollback,disconnect等陳述句時自動將鎖釋放。如果您使用的DBMS支持鎖的操作,在Power-Builder的DataWindow設計時,Select陳述句可在from子句中加上withholdlock:即在dataWindow的SQLWindow中,在表視窗的標題處點擊右滑鼠,彈出選單的最后一個選項即為Holdlock。選擇該項,生成的SQL陳述句將在re-trievel()函式執行后將所查詢的資料加鎖,以避免其他用戶的修改訪問,直至commit,rollback等事件發生后解鎖。這種方式帶來的問題是,當用戶查詢完資料后可能離開計算機長時間不用,這段時間內其他用戶均無法修改資料。此外有些DBMS如Sybase等不支持行級鎖,也就是說當你對某一行查詢時更多的行都被上了鎖,這就更增加了并發處理的局限性。另一個值得注意的問題是在多視窗應用中某一個視窗的事務提交將會導致使用一事務中其他資料視窗的查詢行解鎖,這時修改將可能發生錯誤。某些DBMS系統支持一個稱作"時間戳(timestamp)"的資料項來控制并發性。每張表中都有一個時間戳的資料列,當Insert陳述句或Update陳述句對資料行作修改時該列自動被修改為當前時間。當你要作修改時,where子句可檢查時間戳列在查詢時和修改時兩個值是否相符,以此來確保您作出的修改不會覆寫別人的修改,因此這種確認方式與Key and Updateable Columns選項相同。即使兩個用戶對同一行的不同列作修改,后一個修改者也將失敗。在常用的關系型資料庫中Sybase和Microsoft的SQLServer支持時間戳的使用。而在PowerBuilder中,不管用戶后臺連接何種資料庫,只要表中帶有timestamp的列名且資料型別為datetime,PB將自動忽略Updatecharacteristics的選項,而在where子句中生成主鍵和時間戳列的比較。
如果您所用的資料庫不支持時間戳但支持觸發器,您也可以在表中增加一列整數型的列。當有對表中某種記錄作修改時,該列自動加1。下列使用的是Watcom資料庫,對Shipper表增加Updcnt欄位并作兩個觸發器,這樣任何用戶或行程試圖修改某行記錄時,該欄位均可發生變化。
對INSERT觸發器的撰寫如下:
DROPTRIGGERINS—SHIPPER’
CREATETRIGGERSHIPPERBEFOREINSERTONSHIPPER
REFERENCINGNEWASNewvalue
FOREACHROW
BEGIN
SETnewvalue.UpdCnt=newvalue.UpdCnt+1;
END'
同理可撰寫UPDATE觸發器。
在您的PowerBuilder應用之中,除表的主鍵外,必須再加上這一列作為檢測列加入Update陳述句中的Where子句中,這樣再作Update操作時,后臺資料庫會比較修改時與用戶作Retrieve操作時資料是否相等,以確認是否能作修改。在DataWindows中在SpecifyUpdateCharacteris-tics的對話框的右下角的Uniquekeycolumn(s)中加上Updcnt一項,同時注意whereclause中選擇Key Columns,這樣PowerBuilder在構造where子句時就會認為Updcnt亦是表的主鍵,而成為檢測項。
當資料視窗的Update函式被呼叫后,觸發器將修改過記錄中的Updcnt串列為新值,為保證下一次修改能夠有效,您應當立即作Retrieve()以使DataWindow緩沖區中Updcnt的值與資料庫相同。顯然修改后立即查詢的代價要比其他任何一種并發控制的代價要小得多。
uj5u.com熱心網友回復:
事務物件問:事務物件到底是何方神圣呢?
答:它是PowerBuilder眾多物件中最重要的一個物件,并且也是最不好理解的一個物件。它實際上是PowerBuilder程式與資料庫之間傳遞資訊的一個結構變數,共有15個成員。
[注]事務物件的15個成員
序號
名稱
型別
說明
1
DBMS
string
所使用的資料庫管理系統的名字,如Sybase,Oracle,ODBC。
2
Database
string
要連接的資料庫名字。
3
UserID
string
連接資料庫所用的用戶名。有的DBMS不需要此項。
4
DBPass
string
用戶連接資料庫的口令。
5
Lock
string
這是資料庫的保護級別,一般不必給出。
6
LogID
string
登錄到資料庫服務器上的用戶名,有的DBMS不需要此項,但Sybase和Oracle需要指定這個引數。
7
LogPass
string
登錄到資料庫服務器上的用戶口令。這個屬性可設可不設,但Sybase和Oracle需要指定口令。
8
ServerName
string
資料庫服務器名。
9
AutoCommit
boolean
指定是否將資料庫設定成自動提交所有事務。默認是False,也就是說,必須在應用程式中進行事務管理,并在適當的時候對資料庫提交事務。如果選擇True,則每個事務都由系統自動提交。
10
DBParm
string
用于向資料庫傳遞特殊資訊的屬性。
11
SQLCode
long
指示最近一次SQL操作失敗或成功。它的取值為:
回傳結果
0
無錯誤。
-1
出現一個錯誤。
100
沒有檢索到資料。
12
SQLNRows
long
最近一次SQL操作影響的行數,資料庫不同其含義也不同。
13
SQLDBCode
long
資料庫錯誤代碼。不同的資料庫的含義不同。
14
SQLErrText
string
相應于SQLDBCode屬性中錯誤碼的文字說明。
15
SQLReturnData
string
回傳DBMS執行SQL的附加資訊,不同的DBMS其值不同。
例子:這是一個連接Sybase資料庫所需的代碼實體:
sqlca.dbms="Sybase"
sqlca.database="testdatabase"
sqlca.logid="lihongwei"
sqlca.logpass="lag"
sqlca.servername="jhc_server"
sqlca.autocommit=false
這是一個連接ODBC資料庫(如Sybase SQLAnywhere 5.0)所需的代碼實體:
sqlca.dbms="odbc"
sqlca.dbparm="connectstring='dsn=testdatabase'"
uj5u.com熱心網友回復:
PB的事務管理機制Power Builder(簡稱PB)作為客戶/服務器應用客戶端開發工具越來越得到廣泛使用。理解PB 的事務管理機制對掌握PB和在應用中靈活運用至關重要。
我們知道要對后端資料庫操作,首先應進行連接,操作結束后再斷開連接。就象VFP 中通過定義的連接Connection來提供連接資料庫所需引數,如DBMS名稱、資料庫名稱、注冊用戶標識、口令、服務器名稱等,而PowerBuilder則通過事務物件Transaction Objects傳遞連接資訊給資料庫,也可以從資料庫取得資訊,PB以指定事務物件進行的連接為事務管理單位。預設事務物件為SQLCA,SQLCA全域有效,在任何腳本里都可使用,SQLCA 中包含連接資料庫所需資訊。
可以根據需要使用自定義事務物件,事務物件的使用也同其它物件一樣需要定義事務物件變數,然后創建(分配空間),但全域SQLCA 無需定義和創建,SQLCA是應用分流運行時自動被創建。
使用步驟如下:
1、定義事務物件變數transaction OracleTrobject
2、創建事務物件,為事務物件變數分配空間OracleTrobject Transaction
3、指定連接資訊
OraleTrobject.DBMS=″ORACIE″
OraleTrobject.Database=″LDMIS″
OraleTrobject.UserID=″wxh″
OraleTrobject.DBpass=″12345″
OraleTrobject.serverName=″jycmain″
OraleTrobject.LogID=″jycwxh″
OraleTrobject.Logpass=″wxh660304″
如果使用SQLCA連接無需1、2步,但仍需使用本步對連接引數設定。
4、連接資料庫connect using OracleTrobject或connect,使用SQLCA連接
5、建立事務物件與對應資料視窗連接
dw—oracle.SetTransobject(OracleTrobject)
6、取資料、更新資料
7、提交或回滾事務
COMMIT using OracleTrobject)
Rollback Using Oracltiobject)
8、斷開連接、釋放事務物件變數
Disconnect using OracleTrobject
Destrog using OracleTrobject
事務物件是資料視窗控制元件與資料連接的紐帶,對使用預設的事務物件SQLCA連接資料庫,則無需使用Using子句。 資料視窗控制元件可以擁有自己的內部事務物件,通過dw_Oracle.Settrans(OracleTrobject)來設定資料視窗控制元件dw_Oracle的內部事務物件,實際上是把事務物件OracleTrobject 的內容拷貝到資料視窗控制元件dw_Oracle的內部事務物件中,然后通過此資料視窗控制元件對資料庫操作,與事務物件OracleTrobject無關,即使之后對事務物件OracleTrobject內容作了改變,也不會影響資料視窗控制元件dw_Oracle 的內部事務物件內容。
多個資料視窗控制元件,可以共享某個事務物件。事務控制以事務物件為單位,事務的提交和回滾都是對應某個事務物件而言。連接資料庫時只需在使用前進行一次連接即可,不必對資料視窗控制元件分別連接。可以通過建立多個事務物件同時與多個資料庫建立連接,也可以多個事務物件根據不同的注冊要求,設定不同的注冊引數,連接至同一個資料庫。
uj5u.com熱心網友回復:
事務的屬性事務具有ACID屬性
即 Atomic原子性, Consistent一致性, Isolated隔離性, Durable永久性
原子性
就是事務應作為一個作業單元,事務處理完成,所有的作業要么都在資料庫中保存下來,要么完全
回滾,全部不保留
一致性
事務完成或者撤銷后,都應該處于一致的狀態
隔離性
多個事務同時進行,它們之間應該互不干擾.應該防止一個事務處理其他事務也要修改的資料時,
不合理的存取和不完整的讀取資料
永久性
事務提交以后,所做的作業就被永久的保存下來
二 事務并發處理會產生的問題
丟失更新
當兩個或多個事務選擇同一行,然后基于最初選定的值更新該行時,會發生丟失更新問題、
每個事務都不知道其它事務的存在。最后的更新將重寫由其它事務所做的更新,這將導致資料丟失。
臟讀
當第二個事務選擇其它事務正在更新的行時,會發生未確認的相關性問題。
第二個事務正在讀取的資料還沒有確認并且可能由更新此行的事務所更改。
不可重復讀
當第二個事務多次訪問同一行而且每次讀取不同的資料時,會發生不一致的分析問題。
不一致的分析與未確認的相關性類似,因為其它事務也是正在更改第二個事務正在讀取的資料。
然而,在不一致的分析中,第二個事務讀取的資料是由已進行了更改的事務提交的。而且,不一致的分析涉及多次(兩次或更多)讀取同一行,而且每次資訊都由其它事務更改;因而該行被非重復讀取。
幻像讀
當對某行執行插入或洗掉操作,而該行屬于某個事務正在讀取的行的范圍時,會發生幻像讀問題。
事務第一次讀的行范圍顯示出其中一行已不復存在于第二次讀或后續讀中,因為該行已被其它事務洗掉。同樣,由于其它事務的插入操作,事務的第二次或后續讀顯示有一行已不存在于原始讀中。
三 事務處理型別
自動處理事務
系統默認每個T-SQL命令都是事務處理 由系統自動開始并提交
隱式事務
當有大量的DDL 和DML命令執行時會自動開始,并一直保持到用戶明確提交為止,切換隱式事務可以用SET IMPLICIT_TRANSACTIONS
為連接設定隱性事務模式.當設定為 ON 時,SET IMPLICIT_TRANSACTIONS 將連接設定為隱性事務模式。當設定為 OFF 時,則使連接回傳到自動提交事務模式
用戶定義事務
由用戶來控制事務的開始和結束 命令有: begin tran commit tran rollback tran 命令
分布式事務
跨越多個服務器的事務稱為分布式事務,sql server 可以由DTc microsoft distributed transaction coordinator
來支持處理分布式事務,可以使用 BEgin distributed transaction 命令啟動一個分布式事務處理
四 事務處理的隔離級別
使用SET TRANSACTION ISOLATION LEVEL來控制由連接發出的所有陳述句的默認事務鎖定行為
從低到高依次是
READ UNCOMMITTED
執行臟讀或 0 級隔離鎖定,這表示不發出共享鎖,也不接受排它鎖。當設定該選項時,可以對資料執行未提交讀或臟讀;在事務結束前可以更改資料內的數值,行也可以出現在資料集中或從資料集消失。該選項的作用與在事務內所有陳述句中的所有表上設定 NOLOCK 相同。這是四個隔離級別中限制最小的級別。
舉例
設table1(A,B,C)
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
新建兩個連接
在第一個連接中執行以下陳述句
select * from table1
begin tran
update table1 set c='c'
select * from table1
waitfor delay '00:00:10' --等待10秒
rollback tran
select * from table1
在第二個連接中執行以下陳述句
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
print '臟讀'
select * from table1
if @@rowcount>0
begin
waitfor delay '00:00:10'
print '不重復讀'
select * from table1
end
第二個連接的結果
臟讀
A B C
a1 b1 c
a2 b2 c
a3 b3 c
'不重復讀'
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
READ COMMITTED
指定在讀取資料時控制共享鎖以避免臟讀,但資料可在事務結束前更改,從而產生不可重復讀取或幻像資料。該選項是 SQL Server 的默認值。
在第一個連接中執行以下陳述句
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
begin tran
print '初始'
select * from table1
waitfor delay '00:00:10' --等待10秒
print '不重復讀'
select * from table1
rollback tran
在第二個連接中執行以下陳述句
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
update table1 set c='c'
第一個連接的結果
初始
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
不重復讀
A B C
a1 b1 c
a2 b2 c
a3 b3 c
REPEATABLE READ
鎖定查詢中使用的所有資料以防止其他用戶更新資料,但是其他用戶可以將新的幻像行插入資料集,且幻像行包括在當前事務的后續讀取中。因為并發低于默認隔離級別,所以應只在必要時才使用該選項。
在第一個連接中執行以下陳述句
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
begin tran
print '初始'
select * from table1
waitfor delay '00:00:10' --等待10秒
print '幻像讀'
select * from table1
rollback tran
在第二個連接中執行以下陳述句
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
insert table1 select 'a4','b4','c4'
第一個連接的結果
初始
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
幻像讀
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
a4 b4 c4
SERIALIZABLE
在資料集上放置一個范圍鎖,以防止其他用戶在事務完成之前更新資料集或將行插入資料集內。這是四個隔離級別中限制最大的級別。因為并發級別較低,所以應只在必要時才使用該選項。該選項的作用與在事務內所有 SELECT 陳述句中的所有表上設定 HOLDLOCK 相同。
在第一個連接中執行以下陳述句
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
begin tran
print '初始'
select * from table1
waitfor delay '00:00:10' --等待10秒
print '沒有變化'
select * from table1
rollback tran
在第二個連接中執行以下陳述句
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
insert table1 select 'a4','b4','c4'
第一個連接的結果
初始
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
沒有變化
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
五 事務處理嵌套的語法和對@@TRANCOUNT的影響
BEGIN TRAN @@TRANCOUNT+1
COMMIT TRAN @@TRANCOUNT-1
ROLLBACK TR
uj5u.com熱心網友回復:
資料庫的事務管理在資料庫中,所謂事務是指一組邏輯操作單元,使資料從一種狀態變換到另一種狀態。為確保資料庫中資料的一致性,資料的操縱應當是離散的成組的邏輯單元:當它全部完成時,資料的一致性可以保持,而當這個單元中的一部分操作失敗,整個事務應全部視為錯誤,所有從起始點以后的操作應全部回退到開始狀態。
對事務的操作是這樣進行的:先定義開始一個事務,然后對資料作修改操作,這時如果提交(COMMIT),這些修改就永久地保存下來,如果回退(ROLLBACK),資料庫管理系統將放棄您所作的所有修改而回到開始事務時的狀態。此外有些資料庫支持事務的"存盤點(savepoint)這一概念:即在一個事務行程中任意一點您都可以進行當前狀態的存盤,回退時只是回到你所設定的存盤點,而不必退回全部的事務。如果您的事務可以分成幾組對資料庫的修改,那就可以設定多個存盤點,根據需要您可以回退到任意一個存盤點,而不使所有事務的修改資料全部丟失。
正確地管理事務可以保證資料的完整性,當您所做的作業全部完成和得到確認之前,沒有任何資料物理地寫進資料庫。讓我們來看這樣一個實體,我們有這樣一個銀行應用系統,前臺使用者作出將儲戶甲的一百元存款劃歸儲戶乙帳下的操作;在后臺的資料庫中,這兩個客戶的記錄分儲在兩張表中,當使用者在螢屏上作出如上操作時,在后臺需要對兩張表進行修改。如果在資料庫中對甲用戶存款余款作減去一百元修改后,對乙用戶加一百元的操作修改卻失敗時,前一張表也必須回到修改前的狀態,否則資料庫的內容不統一,甲儲戶白白損失一百元,資訊必然是不正確的。因此進行事務管理是必須的。
傳統地,我們認為一個事務包括了對一個或多個表的修改,而隨著分布式資料庫和資料倉庫的發展,事務可能包括了對一個或多個資料庫的修改。在上例中甲乙兩用戶就可能是異地用戶,資訊分儲在不同地域的不同資料庫中,上述的一個事務就涉及到了對不同資料庫的操作。
PowerBuilder中的事務管理
作為資料庫的前臺開發工具Power-Builder支持事務管理的操作。在Power-Builder中有一種稱作事務(transaction)的物件,這個物件是PowerBuilder應用與資料庫的通訊區域。PowerBuilder在應用開始時建立一個全域的事務物件SQLCA。由于大多數的應用只用到一個資料庫,所以一般開發者主要也只用SQLCA作為與唯一資料庫連接的事務物件。
PowerScript中常用的事務管理的陳述句有四個:COMMIT,ROLLBACK,CONNECT,DISCONNECT。
當您需要應用與資料庫建立連接時使用CONNECT這一操作命令,取消連接時執行DISCONNECT,這兩個命令一般分別用在應用的開始和結束,也就是Appli-cation的Open和Close事件中。
當一個事務的資料庫修改都成功地完成后,修改須提交給資料庫,COM-MIT陳述句是一個舊事務結束和一個新事務開始的界線。在修改被提交前,資料庫的資料并沒有被真正地修改,這些修改被保留在某個作業區,只有作修改的用戶才能看到這些被修改后的值,提交之后,則所有的用戶就都可以看到新值了。
在事務的行程中發生某些錯誤,或者在操作中出于種種原因打算中止事務,須用ROLLBACK命令回退事務,如果已作的操作不用ROLLBACK命令取消,這些操作必將錯誤地作為下一個事務的一部分而導致資料庫的混亂。
如果您使用的是多視窗的應用,卻只用一個事務物件,就應格外注意ROLL-BACK和COMMIT會影響事務的邏輯一致性。在某個視窗執行的這兩個指令會使其他視窗應用中所進行到一半的作業提交或回退。
在多用戶系統中,修改和提交的時間越接近,提交成功的可能性就越高。因為一個事務中所有的SQL陳述句全部執行成功而提交卻失敗是完全可能發生的,例如在您的事務程序中,另一個用戶修改了資料并提交,這很可能使您作出的修改無效,這時COMMIT將失敗,您必須回退這一事務的全部。
事務物件的AutoCommit屬性
事務物件有一個AutoCom-mit的屬性可以使開發者簡化對事務管理的操作,這一布爾型的屬性可以用TRUE或FALSE來對其賦值。當其為真時,PowerBuilder不通過其他額外的互動就將您的SQL陳述句傳輸給后臺資料庫,而且執行完畢自動提交。
當然,您可以設定AutoCommit屬性為假(預設值),使用COMMIT或ROLLBACK這樣的關鍵詞提交或回退事務。在大多數應用中,一部分的資料庫操作是要成組提交的,而另一些則不用。因此我們可以利用AutoCommit的特性來確定事務的起點,當我們把 AutoCommit的屬性設為False時,系統設定此時為事務的起點。當AutoCommit設為真時,系統自動消取這一事務。因此你可以先把AutoCommit設為真,當您需要開始一個事務時,將其置為false,此刻即為事務起始點。
PowerBuilder內部這種事務管理的最大優點是方便。您不去考慮整個事務,而只需把您所作的修改提交或滾回即可。但是方便與可控性總是矛盾的,在Power-Builder中沒有存盤點和嵌套事務管理的機制,即使您所使用的資料庫支持這些特性,在PowerBuilder中卻無法得以體現。不過在普通的應用中,存盤點和嵌套事務管理并不是必須的,一般的事務管理足以夠用。
用資料庫的事務管理指令實作完全控制
上述的事務管理方式盡管簡單方便,但是在某些應用中,我們也的確需要利用所用的資料庫系統的嵌套事務和存盤點的特性,而PowerBuilder內部的事務管理沒有提供這樣的功能,您必須自己設計。
自己進行事務管理的方式是直接使用資料庫本身的事務指令。當您使用自己的管理方式時,就應使Power-Builder停止管理事務,即設定Auto-Commit為TRUE,系統內部就不會自動建構事務處理的命令了。實作人工事務管理的方式是采用EXECUTE IMMEDIATE這條PowerBuilder指令來執行任意的資料庫操作。你所需做的是將資料庫指令編輯成一個字串,您可以執行任何的資料定義陳述句如建表、建主鍵、存盤程序等,例如您可以用
EXECUTE IMMEDIATE BEGIN TRANSACTION trans-name
這樣的指令開始一個事務。采用這種方法,只要您所用的資料庫支持嵌套事務和存盤點等事務管理,我們通過PowerBuilder開發出的應用也就同樣可以實作。
在PowerBuilder中提供的事務管理的方法是多種多樣的,只要您靈活運用,就一定能設計出優秀的資料庫應用來。
uj5u.com熱心網友回復:
transaction gr2gr2=create transaction
gr2.servername= "orcl"
gr2.logid="ccmis"
gr2.logpass= "ccmis"
gr2.dbparm= "PBCatalogOwner='ccmis'"
gr2.dbms= "O90 Oracle9i (9.0.1)"
gr2.autocommit=false
connect using gr2;
select s_ad282.nextval into :s_no from dual using gr2;
uj5u.com熱心網友回復:
一樓八樓正解。uj5u.com熱心網友回復:
支持一樓uj5u.com熱心網友回復:
多事務中內嵌sql陳述句一定要加上using加事務物件名。。。uj5u.com熱心網友回復:
有時候省事并不一定安全。uj5u.com熱心網友回復:
一樓正解uj5u.com熱心網友回復:
同意9樓uj5u.com熱心網友回復:
jfuj5u.com熱心網友回復:
sql陳述句在pb中默認使用sqlca的屬性。如果自己定義了事務,要在后面加 using 事務名稱。
uj5u.com熱心網友回復:
上面的回答真是太全面了,接不著分嘍uj5u.com熱心網友回復:
一樓八樓正解!能否接分啊!uj5u.com熱心網友回復:
select s_ad282.nextval into :s_no from dual using gr2;
uj5u.com熱心網友回復:
好貼,打個標記先uj5u.com熱心網友回復:
都是很好的建議! 值得學習uj5u.com熱心網友回復:
Mark一下每天回帖即可獲得10分可用分!
uj5u.com熱心網友回復:
a = create transactionb= create transaction
a、b 兩個連接資料庫引數完全相同。
重復進行connect using a;
connect using a;
、 connect using a;
有的時候會報 事務已連接,有的時候不報;這個是什么原因呢?
另外 connect using a; 會對 connect using b 有影響嗎
uj5u.com熱心網友回復:
頂a,b相與之間不會影響uj5u.com熱心網友回復:
dingding!!uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
呵呵。記得在SQL 后跟 USING 默認是SQLC,所以用自定義連接多個資料庫的時候一定要記得加USING 。uj5u.com熱心網友回復:
好建議,有時常忘記using...轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/100886.html
標籤:數據庫相關
上一篇:pb6.5下列印機走紙問題
