spring实现postgresql事务_PostgreSQL的事务及其实现机制

本文详细介绍了PostgreSQL的事务机制,包括普通事务、子事务、多事务和2PC(两阶段提交)事务。通过实例解析了事务的开启、提交、回滚以及它们在数据库中的状态存储方式,特别是子事务的提交流程和多事务的行级锁处理。文章还探讨了2PC事务在分布式提交中的作用和实现原理。
摘要由CSDN通过智能技术生成

02fed8676cf2d224472dfb0d0096a317.png

事务是数据库的最基本概念,在PostgreSQL中使用begin;end;命令可以开启和提交事务,当然这是最常见的PostgreSQL事务,除此之外PostgreSQL中还有子事务、多事务、2PC事务的概念。这篇博客,我将会演示这些PostgreSQL事务的出现场景和内核实现方式。

普通事务

使用PostgreSQL客户端连接至PostgreSQL服务器,是默认开启事务自动提交的,也就是说每执行一条DML会自动完成提交过程。用户可以使用set AUTOCOMMIT off命令关闭自动提交,也可以使用begin命令开启一个事务块。

echo :AUTOCOMMIT
create table t1(i int);
insert into t1 values(1);
rollback;
select * from t1;

set AUTOCOMMIT off
echo :AUTOCOMMIT
insert into t1 values(2);
rollback;
select * from t1;
insert into t1 values(22);
commit;
select * from t1;
commit;

set AUTOCOMMIT on
echo :AUTOCOMMIT
begin;
insert into t1 values(3);
rollback;
select * from t1;
begin;
insert into t1 values(33);
commit;
select * from t1;
postgres=# echo :AUTOCOMMIT
on
postgres=# create table t1(i int);
CREATE TABLE
postgres=# insert into t1 values(1);
INSERT 0 1
postgres=# rollback;
2020-06-08 15:15:50.261 CST [29689] WARNING:  there is no transaction in progress
WARNING:  there is no transaction in progress
ROLLBACK
postgres=# select * from t1;
 i 
---
 1
(1 row)

postgres=# 
--自动提交开启的情况下,我们执行的DML语句已成功提交,rollback没有对我们造成影响
postgres=# set AUTOCOMMIT off
postgres=# echo :AUTOCOMMIT
off
postgres=# insert into t1 values(2);
INSERT 0 1
postgres=# rollback;
ROLLBACK
postgres=# select * from t1;
 i 
---
 1
(1 row)

postgres=# insert into t1 values(22);
INSERT 0 1
postgres=# commit;
COMMIT
postgres=# select * from t1;
 i  
----
  1
 22
(2 rows)

postgres=#
--自动提交关闭的情况下,我们执行的DML语句都被rollback回滚,也可被commit提交
postgres=# commit;
COMMIT
postgres=# 
postgres=# set AUTOCOMMIT on
postgres=# echo :AUTOCOMMIT
on
postgres=# begin;
BEGIN
postgres=# insert into t1 values(3);
INSERT 0 1
postgres=# rollback;
ROLLBACK
postgres=# select * from t1;
 i  
----
  1
 22
(2 rows)

postgres=# begin;
BEGIN
postgres=# insert into t1 values(33);
INSERT 0 1
postgres=# commit;
COMMIT
postgres=# select * from t1;
 i  
----
  1
 22
 33
(3 rows)

postgres=#
----在begin事务块,我们执行的DML语句可以被rollback回滚,也可被commit提交

现在我们借助pageinspa

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值