主頁 > 資料庫 > 關于PB自定義事務的問題 100分求解

關于PB自定義事務的問題 100分求解

2020-09-22 01:30:22 資料庫

在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   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 using gr2; 

uj5u.com熱心網友回復:

一樓八樓正解。

uj5u.com熱心網友回復:

支持一樓

uj5u.com熱心網友回復:

多事務中內嵌sql陳述句一定要加上using加事務物件名。。。

uj5u.com熱心網友回復:

有時候省事并不一定安全。

uj5u.com熱心網友回復:

 一樓正解

uj5u.com熱心網友回復:

同意9樓

uj5u.com熱心網友回復:

jf

uj5u.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 transaction
 b=  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下列印機走紙問題

下一篇:PB9升級到Pb11,中文出現亂碼!急

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more