1. Read Uncommitted(读取未提交数据):
- 允许一个事务读取其他事务未提交的数据。
- 数据的可见性最低,但同时也存在最大的并发性。
2. Read Committed(读取提交数据):
- 一个事务只能读取已经提交的其他事务的数据。
- PostgreSQL 默认使用的是 Read Committed 隔离级别。
3. Repeatable Read(可重复读):
- 事务执行期间,可以多次读取相同的数据,并保证其一致性。
- 防止出现“幻读”,但不防止“不可重复读”。
4. Serializable(串行化):
- 提供最高的事务隔离级别,确保事务执行期间不会受到其他事务的干扰。
- 通过锁定确保了最高级别的隔离性,但可能会降低并发性。
PostgreSQL 的 MVCC(多版本并发控制)
PostgreSQL 使用 MVCC(Multi-Version Concurrency Control)机制来实现不同事务隔离级别下的数据可见性。MVCC 在数据库中创建了不同版本的数据,每个事务都可以看到一个时间点的数据库状态。
在 MVCC 中,每行数据都有一个或多个版本号,用于标识在不同事务中的修改。当事务执行时,只能看到在该事务开始之前已经提交的版本,而不会看到尚未提交的或在此事务中已经修改但尚未提交的版本。
可见性规则
在 PostgreSQL 中,以下是数据的可见性规则:
1. Read Uncommitted:
- 可以读取其他事务未提交的数据,包括脏读、不可重复读和幻读。
2. Read Committed:
- 只能读取已提交的数据。
- 防止脏读,但仍可能发生不可重复读和幻读。
3. Repeatable Read:
- 事务期间读取的数据保持一致,即使其他事务提交了新的数据。
- 防止脏读和不可重复读,但仍可能发生幻读。
4. Serializable:
- 提供最高级别的数据隔离。
- 防止脏读、不可重复读和幻读。
示例
以下是一个简单的示例,演示了在 Repeatable Read 隔离级别下的可见性规则:
-- Session 1
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- Reading data
SELECT * FROM my_table; -- Returns initial data
-- Session 2
BEGIN TRANSACTION;
-- Modifying data
UPDATE my_table SET value = value + 1;
-- Session 1
-- Reading data again
SELECT * FROM my_table; -- Returns initial data, not affected by uncommitted changes in Session 2
-- Session 2
COMMIT;
-- Session 1
-- Reading data again
SELECT * FROM my_table; -- Returns initial data, not affected by committed changes in Session 2
COMMIT;
在上述示例中,Session 1 在 Repeatable Read 隔离级别下启动了一个事务,并在事务中多次读取了相同的数据。即使在 Session 2 中有一个事务修改了数据并提交,Session 1 依然只能看到在其事务开始之前已提交的版本,从而保证了数据的可重复读性。
转载请注明出处:http://www.zyzy.cn/article/detail/8484/PostgreSQL