12.pgsql存储过程中得事务理解与实验

本文通过三个测试场景详细分析了在PostgreSQL存储过程中,子事务和全局事务的异常处理。实验表明,子事务的异常不会影响全局事务和其他子事务,而全局事务的异常将导致所有操作回滚。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.测试表准备

-- 1.准备插入数据得表
create table t_tx(
	id serial primary key,
	name varchar(255) not null,
	age int not null
)

-- 2.记录异常得表
create table t_log(
	id serial primary key,
	msg varchar(255)
)

2.第一种情况测试-子事务1出现异常

函数(存储过程)代码如下:

-- 测试子事务1出现异常
create or replace function test_tx() returns void as 
$$
declare
	result integer;
-- 1.全局事务
begin
	-- 1.子事务1
	begin
		INSERT INTO t_tx(name,age) VALUES ('事务1',18);
		result=1/0;
	exception
		when others then
		insert into t_log (msg) values('子事务1发生异常');
	end;		
			
	-- 2.子事务2
	begin
		INSERT INTO t_tx(name,age) VALUES ('事务2',18);
	exception
		when others then
		insert into t_log (msg) values('子事务1发生异常');
	end;
	INSERT INTO t_tx(name,age) VALUES ('全局事务',18);
exception
	when others then
	insert into t_log (msg) values('全局事务发生异常');		
end;
$$ LANGUAGE 'plpgsql' VOLATILE;

执行代码为:

select test_tx();
s
<think>嗯,用户想了解PostgreSQL的5432端口相关的锁文件,具体是.s.PGSQL.5432和.s.PGSQL.5432.lock的用途和目的。我需要先回忆一下PostgreSQL的通信机制。PostgreSQL默认使用5432端口,而锁文件通常用于确保同一时间只有一个实例使用该端口。 首先,Unix域套接字方面,PostgreSQL在启动时会创建.s.PGSQL.5432,这是用于本地通信的套接字文件。用户可能通过psql本地连接时会用到这个文件,而不是走TCP/IP。然后,.lock文件的作用应该是防止多个PostgreSQL实例绑定到同一个端口,起到锁定的作用。这个文件可能包含进程ID,确保独占访问。 需要确认这些文件的位置,通常在数据目录的pg_hba.conf中或者默认的/run/postgresql。另外,用户可能遇到端口冲突的问题,这时候检查这些锁文件是否存在,或者手动删除(但要注意安全)。还有,如果用户修改了端口号,这些文件的名称也会相应改变,比如变成5433。 可能的相关问题包括如何检查端口占用,解决启动失败的问题,或者修改PostgreSQL的端口配置。需要确保回答正确,同时引用提供的参考内容中的psql连接示例,比如引用[1]中的psql命令,说明本地连接可能使用域套接字,而lock文件的存在会影响服务启动。 最后,要生成相关问题,比如端口冲突解决、修改端口的方法、检查锁文件的步骤等,帮助用户进一步了解相关操作。</think>### PostgreSQL 5432端口锁文件解析 #### 1. 文件作用说明 PostgreSQL在启动时会在Unix域套接字目录(默认路径如`/run/postgresql/`或数据目录)生成两个关键文件: - `.s.PGSQL.5432`:Unix域套接字文件,用于本地进程间通信(IPC) - `.s.PGSQL.5432.lock`:锁文件,防止多实例同时绑定同一端口 #### 2. 技术细节 - **Unix域套接字**:提供比TCP/IP更高效的本地通信方式,通过`psql -h /var/run/postgresql`连接时会使用该机制[^1] - **锁文件机制**: $$ \text{锁文件内容} = \text{进程ID} + \text{时间戳} $$ 通过`fcntl()`系统调用实现原子性文件锁 - **TCP/IP端口冲突检测**:同时检查`net.ipv4.ip_local_port_range`范围内的端口占用 #### 3. 典型应用场景 1. 服务启动时自动创建(`pg_ctl start`) 2. 客户端连接时验证端口可用性 3. 集群管理工具检测实例状态 #### 4. 操作示例 ```bash # 查看锁文件状态 ls -l /var/run/postgresql/.s.PGSQL.5432* # 强制清理残留锁文件(需先停止服务) rm -f /var/run/postgresql/.s.PGSQL.5432* ``` #### 5. 故障排查 当出现`FATAL: lock file ".s.PGSQL.5432.lock" already exists`错误时,可能原因包括: - 异常关机导致锁文件残留 - 文件系统权限问题 - NFS共享目录的锁机制冲突
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值