process_id,session_id,transaction_id及事务回滚
process_id:进程id
session_id:会话id
transaction_id:事务id
一,session_id和transaction_id
概念:
一个会话可以启动多个事务,会话是session,指一次连接
事务是一个操作单元,要么成功,要么失败,没有中间状态
会话中可以完成多个事务
解析:
连接一次数据库,就建立了一个会话
连接一次数据库,可以执行多个单元的sql,每个或成功或失败的单元的sql,就是一个事务
是一个由多条SQL语句组成的工作逻辑单元,这些语句要么全部执行成功,要么全部不执行。只有commit,rollback
事务具有四个属性,不是会话具有四个属性,(原子性,一致性,持久性,隔离性)
总结:
一次会话可以包含多次事务
一次事务必然属于同一个会话
二, session_id和process_id
概念:
session_id:用于区分每一个会话,会话id是会话的唯一标识
process_id:postgresql的基于进程的模型,每个连接会分配一个bakend process,因此使用process_id也可以作为会话id来使用
区别:
process_id是会变的(在同一时间点唯一,但是会话退出后,其他会话新建的process可能id会与之前断开的会话的process_id一致),实际上就是进程id
而session_id 在整个时间跨度上全局唯一
同一时刻是不可能出现两个一样的process id的
会话启动时间+PROCESS ID”可以作为一个集群唯一的session id
postgres中session_id的由来如下
create or replace function session_id(int default pg_backend_pid()) returns text as $$
select extract('epoch' from backend_start)||'.'||to_hex(pid) from pg_stat_activity where pid=$1 limit 1;
$$ language sql strict;
select session_id();
###
注意:pg_stat_activity中的三个时间
backend_start:这个进程被启动的时间。对客户端后端来说就是客户端连接到服务器的时间。
xact_start:这个进程的当前事务被启动的时间,如果没有活动事务则为空。如果当前查询是它的第一个事务,这一列等于query_start。
query_start:当前活动查询被开始的时间,如果state不是active,这个域为上一个查询被开始的时间
三,postgressql的回滚
回滚是在事务级别的,不是会话级别,也不是进程级别
1.postgres事务控制
使用如下命令控制事务
begin或者begin transaction:开始一个事务
commit或者end或者end transaction:提交事务,执行一系列sql
rollback:回滚事务
在开始一个事务后,除非遇到commit或者rollback命令,事务才会呗执行
如果还没遇到commit或者rollback,数据库发生异常,也会自动回滚
注意,事务命令只能用于 insert、delete、update 操作,而其他命令,比如建表、删表,会被自动提交。
2.事务具有以下四个标准属性
原子性:事务作为一个整体被执行,相当于一个原子
一致性:确保修改前后数据库都满足约束
隔离性:多个事务能并发执行,互不影响
持久性:已被提交的事务对数据库的修改应该永久保存在数据库中
3.AUTOCOMMIT
在被设置为on(默认)时,每一个SQL命令在成功完成时会被自动提交。
若被设置为off,则必须要输入begin,end等命令来控制事务的提交或回滚
检查当前AUTOCOMMIT参数值:
postgres=# \echo :AUTOCOMMIT
修改当前AUTOCOMMIT参数值(会话级别):
postgres=# \set AUTOCOMMIT off|on|to