事务控制
 
                  更新时间 2025-02-05 09:37:09
                 
 
                    最近更新时间: 2025-02-05 09:37:09
                  
 本页介绍天翼云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 1
- 
select...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的行锁 
 
- 
