事務控制
更新時間 2025-02-14 10:25:14
最近更新時間: 2025-02-14 10:25:14
分享文章
本頁介紹天翼云TeleDB數據庫的事務控制方法。
開始一個事務
teledb=# begin; BEGIN或者
teledb=# begin TRANSACTION ; BEGIN也可以定義事務的級別。
teledb=# begin transaction isolation level read committed ; BEGIN提交事務
會話1訪問
teledb=# begin; BEGIN teledb=# delete from bills where id = 11; DELETE 1 teledb=# select * from bills; id | goodsdesc | beginunit | begincity | pubtime | amount ----+-----------------------+-----------+-----------+---------------------+--------- 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 (10 rows)TeleDB也是完全支持ACID特性,沒提交前開啟另一個連接查詢,你會看到是11條記錄,這是TeleDB隔離性和多版本視圖的實現,如下所示
會話2訪問
teledb=# select * from bills order by id; id | goodsdesc | beginunit | begincity | pubtime | amount ----+------------------------+-----------+-----------+---------------------+--------- 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 11 | 普貨40噸需13米半掛一輛 | 上海市 | 上海市 | 2015-10-05 08:13:59 | 1425.64 (11 rows)會話1提交事務
teledb=# commit; COMMIT會話2重新查詢數據,這個時候只能查到10條,這個級別叫讀已提交
teledb=# select * from bills order by id; id | goodsdesc | beginunit | begincity | pubtime | amount ----+-----------------------+-----------+-----------+---------------------+--------- 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 (10 rows)回滾事務
teledb=# begin; BEGIN teledb=# delete from bills where id = 10; DELETE 1 teledb=# select * from bills; id | goodsdesc | beginunit | begincity | pubtime | amount ----+-----------------------+-----------+-----------+---------------------+--------- 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 (9 rows) teledb=# rollback; ROLLBACK teledb=# select * from bills order by id; id | goodsdesc | beginunit | begincity | pubtime | amount ----+-----------------------+-----------+-----------+---------------------+--------- 1 | 衣服 | 海南省 | 三亞市 | 2015-10-05 09:32:01 | 3714.15 2 | 建筑設備 | 福建省 | 三明市 | 2015-10-05 07:21:22 | 8195.98 3 | 設備 | 福建省 | 三明市 | 2015-10-05 11:21:54 | 6351.44 4 | 普貨 | 福建省 | 三明市 | 2015-10-05 15:19:17 | 7626.41 5 | 5 0鏟車,后八輪翻斗車 | 河南省 | 三門峽市 | 2015-10-05 07:53:13 | 6252.91 6 | 鮮香菇2000斤 | 河南省 | 三門峽市 | 2015-10-05 10:38:29 | 1828.83 7 | 旋挖附件38噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9376.8 8 | 旋挖附件35噸 | 河南省 | 三門峽市 | 2015-10-05 10:48:38 | 9885.95 9 | 旋挖附件39噸 | 河南省 | 三門峽市 | 2015-10-05 11:38:38 | 4971.79 10 | 設備 | 上海市 | 上海市 | 2015-10-05 07:59:35 | 1784.63 (10 rows)rollback之后數據回滾
行鎖在事務中的運用
環境準備
teledb=# create table t_row_lock(id int,mc text,primary key (id)) distribute by shard(id); CREATE TABLE teledb=# insert into t_row_lock values(1,'teledb'),(2,'pgxz'); COPY 2 teledb=# select * from t_row_lock; id | mc ----+--------- 1 | teledb 2 | pgxz (2 rows)直接update 獲取
會話1
teledb=# begin; BEGIN teledb=# set lock_timeout to 1; SET teledb=# update t_row_lock set mc='teledb' where mc='pgxz'; UPDATE 1會話2
teledb=# begin; BEGIN teledb=# set lock_timeout to 1; SET teledb=# update t_row_lock set mc='teledb' where mc='pgxz'; UPDATE 1 teledb=# update t_row_lock set mc='postgresql' where mc='pgxz'; ERROR: node:dn01, backend_pid:10158, nodename:dn01,backend_pid:10158,message:canceling statement due to lock timeout上面session1與session2分別持有mc=pgxz行和mc=teledb的行鎖
會話1提交事務
teledb=# commit; COMMIT會話2重新更新
teledb=# commit; ROLLBACK teledb=# update t_row_lock set mc='postgresql' where mc='pgxz'; UPDATE 0 teledb=# update t_row_lock set mc='postgresql' where mc='teledb'; UPDATE 1select...for update 獲取
會話1
teledb=# begin; BEGIN teledb=# set lock_timeout to 1; SET teledb=# select * from t_row_lock where mc='postgresql' for update; id | mc ----+------------ 2 | postgresql (1 row)會話2
teledb=# begin; BEGIN teledb=# set lock_timeout to 1; SET teledb=# select * from t_row_lock where mc='teledb' for update; id | mc ----+--------- 1 | teledb (1 row)上面session1與session2分別持有mc=postgresql行和mc=teledb的行鎖