Транзакции ACID — это важная концепция в системах управления базами данных (СУБД), которая обеспечивает корректность, согласованность и надежность операций с базами данных. ACID означает атомарность, согласованность, изоляцию и долговечность [2]. В этой статье мы рассмотрим значение транзакций ACID и предоставим практические примеры использования операторов SQL в Python.

Транзакция — это единая логическая единица работы, которая осуществляет доступ к содержимому базы данных и изменяет ее [1]. Он может состоять из одного или нескольких операторов SQL, но для того, чтобы он считался успешным, либо все операторы SQL должны завершиться успешно, либо ни один из них не должен выполняться вообще. Это гарантирует, что база данных останется в новом стабильном состоянии или вернется к состоянию до начала транзакции.

Давайте рассмотрим пример онлайн-транзакции, включающей три оператора SQL. Предположим, Роуз покупает пару ботинок за 200 долларов в обувном магазине. Транзакция требует следующих обновлений базы данных:

  1. Уменьшить баланс счета Роуз на 200 долларов.
  2. Увеличьте баланс счета Обувного магазина на 200 долларов США.
  3. Уменьшите уровень запаса ботинок в обувном магазине на 1.

Чтобы реализовать эту транзакцию на Python, вы можете использовать API доступа к конкретной базе данных, например ibm_db для Python, для выполнения операторов SQL [3]. Вот пример фрагмента кода:

import ibm_db

# Connect to the database
conn = ibm_db.connect("DATABASE=your_database;HOSTNAME=your_hostname;PORT=your_port;PROTOCOL=TCPIP;UID=your_username;PWD=your_password;", "", "")

# Begin the transaction implicitly

try:
    # Execute the SQL statements
    stmt1 = ibm_db.exec_immediate(conn, "UPDATE accounts SET balance = balance - 200 WHERE customer = 'Rose'")
    stmt2 = ibm_db.exec_immediate(conn, "UPDATE accounts SET balance = balance + 200 WHERE customer = 'Shoe Shop'")
    stmt3 = ibm_db.exec_immediate(conn, "UPDATE inventory SET stock = stock - 1 WHERE product = 'boots'")

    # Commit the transaction if all statements executed successfully
    ibm_db.commit(conn)
    print("Transaction successful!")

except:
    # Rollback the transaction if any statement fails
    ibm_db.rollback(conn)
    print("Transaction failed!")

# Close the database connection
ibm_db.close(conn)

В этом примере транзакция начинается неявно, а операторы SQL выполняются с использованием модуля ibm_db. Если все операторы выполняются успешно, транзакция фиксируется, обеспечивая сохранение всех изменений в согласованном состоянии. Однако если какой-либо оператор завершается неудачей, транзакция откатывается, отменяя все изменения, внесенные во время транзакции.

Использование PostGreSQL для иллюстрации того же примера:

import psycopg2

# Connect to the database
conn = psycopg2.connect(database="your_db_name", user="your_username", password="your_password", host="your_host", port="your_port")
cur = conn.cursor()

# Begin ACID transaction
cur.execute("BEGIN;")

try:
    # SQL statements for the transaction
    cur.execute("UPDATE accounts SET balance = balance - 200 WHERE customer_name = 'Rose';")
    cur.execute("UPDATE store_accounts SET balance = balance + 200;")
    cur.execute("UPDATE inventory SET stock = stock - 1 WHERE product_name = 'Boots';")

    # If all statements succeed, commit the transaction
    conn.commit()
    print("Transaction successfully committed.")
except Exception as e:
    # If any statement fails, rollback the transaction
    conn.rollback()
    print("Transaction rolled back due to:", str(e))

# Close the connection
conn.close()

Важно отметить, что транзакции ACID предоставляют следующие свойства:

Атомарность: все изменения, внесенные в транзакцию, должны выполняться успешно или не выполняться вообще. В нашем примере, если какой-либо из операторов UPDATE завершится неудачно, вся транзакция завершится неудачно, что обеспечит согласованность данных.

Согласованность. База данных должна находиться в согласованном состоянии до и после транзакции. В нашем примере баланс аккаунта, баланс магазина и уровень запасов должны обновляться правильно, чтобы обеспечить целостность данных.

Изоляция. Пока транзакция выполняется, никакой другой процесс не должен иметь возможности изменять данные. Это предотвращает несогласованность данных и конфликты. В нашем примере, если другая транзакция одновременно попытается обновить уровень запасов обуви, она будет заблокирована до завершения текущей транзакции.

Долговечность: после фиксации транзакции ее изменения становятся постоянными и сохранятся даже в случае сбоя системы. Обновления и изменения, внесенные транзакцией, записываются на диск и сохраняются в энергонезависимой памяти.

В заключение, понимание транзакций ACID имеет решающее значение для поддержания целостности и согласованности данных в операциях с БД. Внедрив транзакции ACID в свой код, вы можете гарантировать, что ваша база данных останется в надежном состоянии даже в случае сбоев. Используя практические примеры, такие как онлайн-транзакция с использованием операторов SQL в Python, вы можете применять принципы ACID к реальным сценариям и создавать надежные приложения баз данных.