Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

postgresql concurrency #38

Open
swuecho opened this issue Nov 24, 2023 · 1 comment
Open

postgresql concurrency #38

swuecho opened this issue Nov 24, 2023 · 1 comment

Comments

@swuecho
Copy link
Owner

swuecho commented Nov 24, 2023

PostgreSQL implements transactions using a mechanism called Multi-Version Concurrency Control (MVCC). MVCC allows multiple transactions to occur concurrently without conflicting with each other, providing a high level of isolation between transactions.

Here's a simplified overview of how PostgreSQL implements transactions with MVCC:

  1. Snapshot Isolation: Each transaction in PostgreSQL operates on a snapshot of the database at the start of the transaction. This snapshot includes all the changes made by committed transactions up to that point in time.

  2. Transaction ID (XID): PostgreSQL assigns a unique transaction ID (XID) to each transaction. This ID helps in tracking the order of transactions and determining the visibility of data.

  3. Versioning: Instead of modifying data in place, PostgreSQL creates a new version of a row when it is updated. This new version is associated with the transaction ID of the updating transaction. The old version remains visible to transactions that started before the updating transaction.

  4. Visibility Rules: When a transaction reads data, it only sees the rows that were committed before the transaction started. This ensures that each transaction sees a consistent snapshot of the database.

  5. Concurrency Control: Concurrent transactions can proceed without blocking each other. Write operations such as updates or deletes may create new versions of rows, but they don't lock the entire table.

  6. Commit and Rollback: When a transaction commits, its changes become visible to other transactions. If a transaction rolls back, its changes are discarded, and the database remains unchanged.

  7. Isolation Levels: PostgreSQL supports different isolation levels, allowing developers to choose the level of isolation for their transactions. Common isolation levels include Read Uncommitted, Read Committed, Repeatable Read, and Serializable.

By using MVCC, PostgreSQL provides a balance between concurrent access and data consistency, ensuring that transactions can be executed simultaneously while maintaining the ACID properties (Atomicity, Consistency, Isolation, Durability) of transactions.

@swuecho
Copy link
Owner Author

swuecho commented Nov 24, 2023

PostgreSQL supports different isolation levels, which determine how transactions interact with each other. The isolation levels are defined by the SQL standard, and PostgreSQL provides a range of options to accommodate various concurrency requirements. Here are the common isolation levels in PostgreSQL:

  1. Read Uncommitted (Level 0):

    • All transactions can see changes made by other transactions that are not yet committed.
    • PostgreSQL doesn't provide a direct implementation of this level, but you can achieve similar behavior using the READ UNCOMMITTED mode with the SET TRANSACTION command.
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
  2. Read Committed (Level 1):

    • A transaction sees only changes committed by other transactions.
    • This is the default isolation level in PostgreSQL.
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
  3. Repeatable Read (Level 2):

    • A transaction sees only changes committed by other transactions before the transaction began.
    • Prevents non-repeatable reads but allows phantom reads.
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
  4. Serializable (Level 3):

    • Provides the strictest isolation level.
    • Ensures serializability, preventing non-repeatable reads and phantom reads.
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

To set the isolation level for a specific transaction, you can use the SET TRANSACTION command at the beginning of the transaction:

BEGIN;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- or any other desired level
-- Your SQL statements here
COMMIT;

Alternatively, you can set the isolation level for the entire session:

SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE;

Remember that higher isolation levels generally come with increased overhead and may impact performance. It's essential to choose an isolation level that meets the consistency requirements of your application while considering performance implications.

Be aware that the actual behavior of these isolation levels might depend on the specific implementation and configuration of your PostgreSQL instance. Additionally, not all databases support all isolation levels in the same way, so it's a good practice to test thoroughly in your specific environment.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant