目次Python 如那边理数据库事务数据库事务是指一组操作要么全部执行成功,要么全部回滚的过程。事务是确保数据库同等性的重要本领,特殊是在处理需要多步操作的场景时,能够避免部分数据成功更新而部分数据失败的情况。本文将详细先容什么是数据库事务,以及如安在 Python 中通过各种方式(比方,使用 [code]sqlite3[/code]、[code]MySQL[/code]、[code]PostgreSQL[/code] 等数据库驱动)处理事务。 什么是数据库事务?1. 事务的概念数据库事务(transaction)是指一组操作,它们被看作是一个单一的逻辑单元,要么全部执行成功,要么全部执行失败。事务具有以下四个特性,简称为 ACID 特性:
2. 为什么需要事务?事务对于包管数据库操作的可靠性和数据的同等性至关重要。以下是几个常见的使用场景:
在 Python 中处理事务在 Python 中处理数据库事务通常涉及使用数据库驱动(如 [code]sqlite3[/code]、[code]psycopg2[/code]、[code]PyMySQL[/code] 等),这些驱动通常提供内置的事务管理功能。以下是一些常见数据库库和事务管理的示例。 1. 使用 SQLite 处理事务SQLite 是一个轻量级的数据库,广泛用于小型应用和开辟情况中。在 Python 中,[code]sqlite3[/code] 模块提供了事务支持。 事务的根本操作 [code]sqlite3[/code] 默认是在“自动提交”模式下运行的,这意味着每个 SQL 语句都是一个事务。但是,你可以手动控制事务的开始和提交。 [code]import sqlite3 # 毗连到数据库 conn = sqlite3.connect('example.db') try: # 创建游标 cursor = conn.cursor() # 开始事务(默认自动开始,表现调用 conn.commit() 或 conn.rollback() 来结束) cursor.execute("BEGIN") # 执行多个 SQL 语句 cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("Alice", 30)) cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1") # 提交事务 conn.commit() except Exception as e: # 出现错误时回滚事务 conn.rollback() print(f"Transaction failed: {e}") finally: # 关闭毗连 conn.close()[/code]在这个例子中,我们执行了两条 SQL 语句——插入用户数据和更新账户余额。这两条语句被视为一个事务,只有当两者都成功时,才会提交到数据库。一旦其中任何一个操作失败,事务将回滚,取消已完成的操作。 自动提交模式 在 [code]sqlite3[/code] 中,假如不手动控制事务,它将处于自动提交模式。这意味着每条 SQL 语句执行后都会立即提交。 假如你需要在同一个毗连中执行多条语句并确保它们作为一个事务执行,则需要手动控制事务,使用 [code]conn.commit()[/code] 和 [code]conn.rollback()[/code]。 2. 使用 MySQL 处理事务在 MySQL 中,我们可以使用 [code]PyMySQL[/code] 或 [code]MySQL Connector/Python[/code] 等库来处理事务。 使用 PyMySQL 处理事务 [code]import pymysql # 毗连到 MySQL 数据库 conn = pymysql.connect( host='localhost', user='root', password='password', db='test_db' ) try: # 创建游标 cursor = conn.cursor() # 执行多个 SQL 语句 cursor.execute("INSERT INTO users (name, age) VALUES (%s, %s)", ("Bob", 25)) cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE user_id = 2") # 提交事务 conn.commit() except Exception as e: # 假如有任何错误,回滚事务 conn.rollback() print(f"Transaction failed: {e}") finally: # 关闭毗连 conn.close()[/code]在 PyMySQL 中,默认情况下事务是手动控制的。在执行完一组操作后,使用 [code]conn.commit()[/code] 提交事务;假如发生错误,则使用 [code]conn.rollback()[/code] 回滚事务。 使用 MySQL Connector/Python 处理事务 MySQL Connector 是 MySQL 官方提供的 Python 库。事务操作与 [code]PyMySQL[/code] 类似。 [code]import mysql.connector # 毗连到数据库 conn = mysql.connector.connect( host='localhost', user='root', password='password', database='test_db' ) try: cursor = conn.cursor() # 执行多条 SQL 语句 cursor.execute("INSERT INTO orders (order_id, user_id) VALUES (%s, %s)", (101, 1)) cursor.execute("UPDATE inventory SET quantity = quantity - 1 WHERE product_id = 1") # 提交事务 conn.commit() except Exception as e: # 回滚事务 conn.rollback() print(f"Transaction failed: {e}") finally: conn.close()[/code]在 MySQL 中,事务控制的根本步骤与 [code]PyMySQL[/code] 类似,都是先执行 SQL 操作,然后手动提交或回滚事务。 3. 使用 PostgreSQL 处理事务PostgreSQL 是一个功能强大的开源数据库,支持丰富的事务功能。在 Python 中,[code]psycopg2[/code] 是最常用的与 PostgreSQL 交互的库。 使用 [code]psycopg2[/code] 处理事务 [code]import psycopg2 # 毗连到 PostgreSQL 数据库 conn = psycopg2.connect( dbname="test_db", user="user", password="password", host="localhost" ) try: cursor = conn.cursor() # 执行 SQL 操作 cursor.execute("INSERT INTO employees (name, department) VALUES (%s, %s)", ("John", "HR")) cursor.execute("UPDATE payroll SET salary = salary + 500 WHERE employee_id = 3") # 提交事务 conn.commit() except Exception as e: # 事务失败时回滚 conn.rollback() print(f"Transaction failed: {e}") finally: conn.close()[/code][code]psycopg2[/code] 中的事务处理也是手动控制的,事务的提交和回滚需要明白调用 [code]conn.commit()[/code] 或 [code]conn.rollback()[/code]。 4. Django 中的事务处理假如你使用的是 Django 这种高级 Web 框架,事务管理会更加简洁。Django 自带事务管理功能,而且有两种重要的事务处理方式:自动管理和手动管理。 自动事务管理 在 Django 中,默认情况下,全部的数据库操作都在自动提交模式下运行。每次数据库操作都会立即提交。 手动事务管理 对于更复杂的事务,Django 提供了 [code]transaction.atomic()[/code] 这个上下文管理器,允许你手动控制事务。 [code]from django.db import transaction try: with transaction.atomic(): user = User.objects.create(username="alice") Account.objects.create(user=user, balance=1000) except Exception as e: print(f"Transaction failed: {e}")[/code]在这个示例中,[code]transaction.atomic()[/code] 将确保 [code]User[/code] 和 [code]Account[/code] 的创建操作作为一个原子操作。假如任何一个操作失败,整个事务将回滚。 5. SQLAlchemy 中的事务处理假如你使用 ORM 库如 [code]SQLAlchemy[/code],事务管理也黑白常简洁的。SQLAlchemy 允许你在会话(session)级别管理事务。 [code]from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from models import User, Account # 假设已经定义了 ORM 模子 # 毗连数据库 engine = create_engine('sqlite:///example.db') Session = sessionmaker(bind=engine) session = Session() try: # 创建用户和账户 new_user = User(name="Alice") session.add(new_user) new _account = Account(user=new_user, balance=1000) session.add(new_account) # 提交事务 session.commit() except Exception as e: # 事务回滚 session.rollback() print(f"Transaction failed: {e}") finally: session.close()[/code][code]SQLAlchemy[/code] 提供了与数据库会话绑定的事务管理,确保全部操作作为一个事务执行。 事务处理中的常见问题1. 并发事务问题在多用户同时操作数据库时,大概会出现并发事务的问题。常见的并发问题有:
为了办理这些问题,数据库提供了差别的隔离级别,如:
差别数据库对隔离级别的实现有所差别,开辟者应根据具体应用场景选择合适的隔离级别。 2. 死锁问题死锁是指两个或多个事务互相等候对方持有的资源,导致系统无法继续执行。为了办理死锁问题,数据库通常会有自动检测息争除死锁的机制,开辟者也可以通过淘汰锁的持有时间和访问顺序来避免死锁。 总结事务是确保数据库同等性和可靠性的关键机制。在 Python 中,无论是使用原生的数据库驱动,还是使用 ORM 工具如 Django 和 SQLAlchemy,都可以方便地管理数据库事务。开辟者需要根据实际需求,选择合适的事务管理方式,避免常见的并发问题和死锁问题。 到此这篇关于Python 如那边理数据库事务的文章就先容到这了,更多相关Python数据库事务内容请搜刮脚本之家从前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 来源:https://www.jb51.net/python/328611qxz.htm 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
|手机版|小黑屋|梦想之都-俊月星空
( 粤ICP备18056059号 )|网站地图
GMT+8, 2025-7-1 19:30 , Processed in 0.035288 second(s), 19 queries .
Powered by Mxzdjyxk! X3.5
© 2001-2025 Discuz! Team.