-
开始一个事务。
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的行锁
-