PHP实战中知识总结 / PgSQL - 事务隔离级别
一个事务的隔离级别决定当其他事务并行运行时该事务能看见什么数据。
一、事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 | 序列化异常 |
---|---|---|---|---|
读未提交(Read uncommitted) | 允许,但不在 PG 中 | 可能 | 可能 | 可能 |
读已提交(Read committed) | 不可能 | 可能 | 可能 | 可能 |
可重复读(Repeatable read) | 不可能 | 不可能 | 允许,但不在 PG 中 | 可能 |
可序列化(Serializable) | 不可能 | 不可能 | 不可能 | 不可能 |
(1)脏读:一个事务读取了另一个并行未提交事务写入的数据。
(2)不可重复读:一个事务重新读取之前读取过的数据,发现该数据已经被另一个事务(在初始读之后提交)修改。
(3)幻读:一个事务重新执行一个返回符合一个搜索条件的行集合的查询, 发现满足条件的行集合因为另一个最近提交的事务而发生了改变。
(4)序列化异常:成功提交一组事务的结果与这些事务所有可能的串行执行结果都不一致。
二、相关命令:
命令 | 解释 |
---|---|
SELECT name, setting FROM pg_settings WHERE name ='default_transaction_isolation' | 查看pgsql默认的隔离级别 |
SELECT current_setting('default_transaction_isolation'); | 显示当前数据库和连接信息 |
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; | 设置当前会话事务隔离级别 |
START TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; | 设置当前事务的事务隔离级别 |
BEGIN ISOLATION LEVEL READ UNCOMMITTED READ WRITE; | 设置当前事务的事务隔离级别 |
// 查看pgsql默认的隔离级别
[postgres@iZbp1bum6107bp8mgzkeunZ ~]$ psql
psql (13.0)
Type "help" for help.
postgres=# SELECT name, setting FROM pg_settings WHERE name ='default_transaction_isolation';
name | setting
-------------------------------+----------------
default_transaction_isolation | read committed
(1 row)
// 或者
postgres=*# SELECT current_setting('default_transaction_isolation');
current_setting
read committed
(1 row)