postgresql事物隔离级别以及MVCC

获取当前事物XID:

SELECT txid_current();

事务的操作命令

BEGIN; –开启事务

–事务隔离级别,定义多个事务时间的隔离级别

BEGIN TRANSACTION ISOLATION LEVEl [READ COMMITTED/REPEATABLE READ/SERIALIZABLE]; –一次启动事务并指定事务隔离级别
BEGIN;
TRANSACTION ISOLATION LEVEl [READ COMMITTED/REPEATABLE READ/SERIALIZABLE]; –先启动事务,再设置事务隔离级别

–预备事务,使得事务分阶段可以提交
PREPARE TRANSACTION ‘foobar’;
……
COMMIT PREPARE TRANSACTION ‘foobar’;
ROLLBACK PREPARE TRANSACTION ‘foobar’;

–保存点savepoint,可以支持事务的部分回滚
insert into lyy values(1,’nn’);
savepoint svp1;
insert into lyy values(2,’ff’);
rollback to savepoint svp1;
–此时提交的话,第二个insert未被插入,但是第一个插入成功。

END; 或者 COMMIT; –结束并提交事务
或者 ROLLBACK; –结束并回滚事务

查看当前的事物隔离级别:

postgres=# show default_transaction_isolation;
default_transaction_isolation

read committed
(1 row)
read committed是postgresql默认的隔离级别。

Transaction Isolation Levels

Isolation Level Dirty Read Nonrepeatable Read Phantom Read
Read uncommitted Possible Possible Possible
Read committed Not possible Possible Possible
Repeatable read Not possible Not possible Possible
Serializable Not possible Not possible Not possible

事务隔离级别设置语法

SET TRANSACTION transaction_mode [, …]
SET TRANSACTION SNAPSHOT snapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, …]

where transaction_mode is one of:

ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY
[ NOT ] DEFERRABLE

PostgreSQL的MVCC与锁

PostgreSQL为开发者提供了丰富的对数据并发访问进行管理的工具。在内部,PostgreSQL利用多版本并发控制(MVCC)来维护数据的一致性。这就意味着当检索数据时,每个事务看到的都只是一小段时间之前的数据快照(一个数据库版本),而不是数据的当前状态。这样,如果对每个数据库会话进行事务隔离,就可以避免一个事务看到其它并发事务的更新而导致不一致的数据。MVCC通过避开传统数据库系统锁定的方法,最大限度地减少锁竞争以允许合理的多用户环境中的性能。

使用MVCC与使用锁定模式相比较的优缺点:

在MVCC里,对检索(读)数据的锁请求与写数据的锁请求不冲突,所以读不会阻塞写,而写也从不阻塞读。甚至当通过创新的序列化快照隔离(SSI)级别提供事务隔离的严格等级时,PostgreSQL维持这样的保证。

在PostgreSQL里也有表和行级别的锁定机制,用于给那些无法轻松接受MVCC行为的应用。 不过,恰当地使用MVCC总会提供比锁更好的性能。另外,由应用定义的咨询锁提供了一个获得不依赖于单独事务的锁的机制。

MVCC的实现方法有两种:

1.写新数据时,把旧数据移到一个单独的地方,如回滚段中,其他人读数据时,从回滚段中把旧的数据读出来;

2.写数据时,旧数据不删除,而是把新数据插入。

PostgreSQL数据库使用第二种方法,而Oracle数据库和MySQL中的innodb引擎使用的是第一种方法。

与racle数据库和MySQL中的innodb引擎相比较,PostgreSQL的MVCC实现方式的优缺点如下。

优点:

1.事务回滚可以立即完成,无论事务进行了多少操作;

2.数据可以进行很多更新,不必像Oracle和MySQL的Innodb引擎那样需要经常保证回滚段不会被用完,也不会像oracle数据库那样经常遇到“ORA-1555”错误的困扰;

缺点:

1.旧版本数据需要清理。PostgreSQL清理旧版本的命令成为Vacuum;

2.旧版本的数据会导致查询更慢一些,因为旧版本的数据存在于数据文件中,查询时需要扫描更多的数据块。

你可能感兴趣的:(postgresql)