PostgreSQL

PostgreSQL 知识量:10 - 51 - 182

10.1 事务的基本特性><

事务模型要解决的问题- 10.1.1 -

PostgreSQL的事务模型要解决以下问题:

  • 并发控制:事务需要遵循ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这确保了事务在并发环境中的正确性和可靠性。

  • 数据完整性:事务提供了一种机制,确保数据的完整性不会被其他并发执行的进程所破坏。事务确保了一系列的操作要么全部完成,要么全部不完成,从而保持数据的一致性。

  • 故障恢复:事务为数据库提供了一种恢复机制。当系统意外宕机时,未完成的事务可以被回滚,已提交的事务则保持不变,以保证数据的完整性和一致性。WAL(Write-Ahead Logging)机制是PostgreSQL实现这一目标的关键。

  • 死锁管理:事务需要处理死锁问题,即在两个或多个事务相互等待对方释放资源时,需要有一种机制来检测和解决这种相互等待的状态。PostgreSQL使用多种策略来预防和处理死锁。

  • 隔离级别:事务支持不同的隔离级别,如读未提交、读已提交、可重复读等,以满足不同应用的需求。这些隔离级别用于控制事务如何处理并发读取和写入操作时的可见性问题。

  • 回滚和恢复:当事务失败或需要撤销时,事务模型需要提供一种机制来撤销一系列的操作,确保数据不会被破坏或处于不一致的状态。

  • 并发性能:事务模型需要优化并发性能,确保事务的执行不会导致过多的锁竞争或其他形式的资源争用,从而影响数据库的整体性能。

事务的四大特性- 10.1.2 -

事务的四大特性分别是:原子性、一致性、隔离性和持久性。

  • 原子性:原子性是指事务是数据库中的最小执行单位,事务中的操作要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。

  • 一致性:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。

  • 隔离性:隔离性是指多个事务并发执行时,一个事务的执行不应影响其他事务。隔离性也用于确保并发事务不会互相干扰。如果事务隔离得不到保证,那么就可能发生以下情况:第一,一个事务读取了另一个事务所修改但还未提交的数据;第二,一个事务修改了另一个事务正在修改的数据。

  • 持久性:持久性是指一旦事务被提交,它对数据库中数据的改变是永久性的。接下来的操作或故障不应对其有任何影响。

这四个特性(ACID)确保了数据库事务能正确地被执行,并维护数据库的完整性。

事务隔离级别- 10.1.3 -

PostgreSQL支持四种事务隔离级别,分别是:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。

  • 读未提交(READ UNCOMMITTED):事务可以读取未提交的数据。这是隔离级别最低的一种,可能会导致脏读、不可重复读和幻读。

  • 读已提交(READ COMMITTED):一个事务只能读取已经提交的事务的数据。在这个级别下,脏读问题得到了解决,但不可重复读和幻读仍然可能发生。

  • 可重复读(REPEATABLE READ):这是MySQL的默认事务隔离级别。在这个级别下,事务在开始时选定了一组数据,在整个事务过程中,这些数据的状态是不可变的,确保了在一个事务内多次读取相同的数据结果是一致的。不可重复读问题得到了解决,但幻读可能发生。

  • 串行化(SERIALIZABLE):这是最高的隔离级别。在这个级别下,事务串行化顺序执行,避免了脏读、不可重复读和幻读问题,保证了事务间的完全隔离。