事務控制
更新時間 2025-02-14 10:24:07
最近(jin)更新時間: 2025-02-14 10:24:07
分享文章(zhang)
本頁介紹天翼(yi)云TeleDB數據庫(ku)的事務控(kong)制方(fang)法。
開(kai)始一個(ge)事務(wu)
teledb=# begin; BEGIN或
teledb=# begin TRANSACTION ; BEGIN也可以定義事務的級別。
teledb=# begin transaction isolation level read committed ; BEGIN提(ti)交事務
會(hui)話1訪(fang)問
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特性(xing),沒提交前開啟另一個連接查詢,你會看(kan)到是11條記錄,這(zhe)是TeleDB隔離性(xing)和多版本視圖的實現,如下所示
會話2訪(fang)問
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)會(hui)話1提交(jiao)事(shi)務
teledb=# commit; COMMIT會話2重新查詢數據(ju),這個(ge)時候只能(neng)查到(dao)10條,這個(ge)級(ji)別叫讀已(yi)提交。
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)回(hui)滾(gun)事(shi)務
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之后數據回滾。
行鎖(suo)在(zai)事務中的運用
環境準備
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 獲(huo)取
會話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分(fen)別(bie)持(chi)有mc=pgxz行和mc=teledb的行鎖
會(hui)話1提交事務
teledb=# commit; COMMIT會話2重(zhong)新更新
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 獲取
會話(hua)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)會(hui)話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)上面(mian)session1與session2分別持有mc=postgresql行和mc=teledb的行鎖。