1 業務背景
自治事務(Autonomous Transactions)是一種高級特性,允許你在一個事務中執行另一個獨立的事務。這種機制特別有用,尤其是在需要在一個事務中執行多個操作但又不想因為其中一個操作失敗而影響整個事務的場景。
2 業務影響
在業務觸發情況下,自治事務數會達到瓶勁,GaussDB默認為10個。
如:
3 處理方法
將max_concurrent_autonomous_transaction值按照應用開啟的并發數設置,比較開啟16個并發,那么這個參數要比這個值大,建議值20~30左右。
默認值:
gaussdb=>
gaussdb=>
gaussdb=> show max_concurrent_autonomous_transactions;max_concurrent_autonomous_transactions
----------------------------------------10
(1 row)gaussdb=>
如將max_concurrent_autonomous_transactions值改為20
gs_guc set -Z datanode -I all -N all -c "max_concurrent_autonomous_transactions='20'";
The gs_guc run with the following arguments: [gs_guc -Z datanode -I all -N all -c max_concurrent_autonomous_transactions=10 set ].
Begin to perform the total nodes: 3.
Popen count is 3, Popen success count is 3, Popen failure count is 0.
Begin to perform gs_guc for datanodes.
Command count is 3, Command success count is 3, Command failure count is 0.
Total instances: 3. Failed instances: 0.
ALL: Success to perform gs_guc![Ruby@dtest1 ~]$ cm_ctl stop && cm_ctl start
gaussdb=> show max_concurrent_autonomous_transactions;max_concurrent_autonomous_transactions
----------------------------------------20
(1 row)
注:?max_concurrent_autonomous_transactions參數的修改需要重啟服務。
4 普及自治事務
針對這個問題一起普及自治事務知識點:
1)自治事務用法:
PRAGMA AUTONOMOUS_TRANSACTION,以改標識符表明該存儲過程里面包含有自治事務。且必須放在聲明部分,即“begin”前面
2)與oracle主要區別
在存儲過程中,GaussDB的自治事務“遞交”動作 commit無需顯式指定,“回退”動作rollback 則需要指定,但在oracle數據庫,自治事務遞交與回退操作都需要顯式指定。GaussDB數據庫自治事務支持以下場景:存儲過程,函數,匿名塊,不支持在觸發器中使用。oracle數據庫,自治事務支持存儲過程,函數,匿名塊,以及觸發器。
例:以下是顯式加了rollback回退,如果不加commit情況下,默認提交。
csdn=> create or replace procedure autonomous_4(a int, b int) as
csdn$> declare
csdn$> num3 int :=a;
csdn$> num4 int :=b;>
csdn$> PRAGMA AUTONOMOUS_TRANSACTION;
csdn$> BEGIN
csdn$> INSERT INTO t2 values(num3,num4);
csdn$> rollback;
csdn$> dbe_output.print_line('just use call.');
csdn$> end;
csdn$> /
CREATE PROCEDURE
csdn=> call autonomous_4(300,700);
just use call.autonomous_4
--------------(1 row)csdn=> select * from t2;a | b
-----+-----1 | 2200 | 500
(2 rows)
5 自治事務約束
- 自治事務執行時,將會在后臺啟動自治事務session,可以通過max_concurrent_autonomous_transactions設置自治事務執行的最大并行數量,取值范圍:0~10000,默認值:10。
- 當max_concurrent_autonomous_transactions參數設置為0時,自治事務將無法執行。
- 自治事務新啟session后,將使用默認session參數,不共享主session下對象(包括session級別變量、本地臨時變量、全局臨時表的數據等)。
- 自治事務理論上限為10000,實際上限為動態值,參考GUC參數max_concurrent_autonomous_transactions描述。
- 自治事務受通信緩沖區影響,返回給客戶端的信息大小受限于通信緩沖區長度,超過通信緩沖區長度時報錯。
- 自治事務執行期間,主事務會給自治事務加鎖,異常情況導致此鎖殘留的場景下,需要依賴gs_clean清理殘留鎖,清理周期由GUC參數 gs_clean_timeout控制,默認值為60秒。自治事務的鎖不受lock timeout影響,鎖超時時間為2147483s,自治事務執行超過此時間會報錯鎖超時。
- 自治事務設置建立連接超時時間5s,建立連接嘗試5次。建立連接期間不立即響應信號,每次建立連接前檢查信號。高并發、高CPU、高內存,以及線程池擴容場景下可能存在超時報錯現象。
- 在PACKAGE SPECIFICATION或PACKAGE BODY SPECIFICATION中聲明自治事務PRAGMA AUTONOMOUS_TRANSACTION語法,可成功創建PACKAGE,但自治事務不生效。
- 觸發器函數不支持自治事務。
6 批注
自治事務也有優點:1.隔離性:自治事務允許你在一個事務中處理多個操作,這些操作可以獨立地成功或失敗,互不影響。2.靈活性:適用于復雜的業務邏輯,其中某些操作的成功或失敗不應影響其他操作。3.在某些情況下,可以減少鎖的競爭,提高并發性能。
?