Python数据库操作必备:事务隔离级别全解析

news2024/9/20 23:26:00

更多资料获取

📚 个人网站:ipengtao.com


在数据库操作中,事务隔离是保证数据一致性和并发控制的重要机制。事务隔离级别决定了一个事务可以看到其他事务的哪些更改,常见的隔离级别包括未提交读(Read Uncommitted)、提交读(Read Committed)、可重复读(Repeatable Read)和可串行化(Serializable)。本文将详细介绍这些隔离级别,并展示如何在Python中使用事务隔离,提供相应的示例代码。

事务和隔离级别概述

事务是数据库管理系统中的基本工作单元,用于将多个操作组合成一个逻辑单元。

事务具有四个主要特性(ACID):

  • 原子性(Atomicity):事务中的所有操作要么全部执行,要么全部不执行。
  • 一致性(Consistency):事务执行前后,数据库都处于一致的状态。
  • 隔离性(Isolation):一个事务的执行不应影响其他事务的执行。
  • 持久性(Durability):事务一旦提交,其结果就永久保存在数据库中。

隔离级别是事务的一个重要属性,定义了一个事务在多大程度上与其他事务隔离。不同的隔离级别可以防止不同程度的数据并发问题。

四种隔离级别

  1. 未提交读(Read Uncommitted)

    • 事务可以读取未提交的数据。
    • 可能会导致脏读(Dirty Read)问题。
  2. 提交读(Read Committed)

    • 事务只能读取已提交的数据。
    • 防止脏读,但可能会导致不可重复读(Non-repeatable Read)问题。
  3. 可重复读(Repeatable Read)

    • 事务在开始时看到的数据是一致的,即使其他事务修改了数据。
    • 防止脏读和不可重复读,但可能会导致幻读(Phantom Read)问题。
  4. 可串行化(Serializable)

    • 最高的隔离级别,事务完全隔离,类似于串行执行。
    • 防止脏读、不可重复读和幻读,但性能开销最大。

Python中的事务管理

在Python中,使用事务管理通常依赖于数据库驱动程序或ORM框架。

使用 sqlite3 模块

sqlite3 模块是Python内置的SQLite数据库驱动程序。SQLite支持部分隔离级别设置。

示例:在 sqlite3 中使用事务隔离

import sqlite3

# 连接到SQLite数据库
conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# 设置隔离级别为 DEFERRED,相当于 Read Uncommitted
conn.isolation_level = 'DEFERRED'

# 创建表
cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)''')

# 开始事务
conn.execute('BEGIN')

# 插入数据
cursor.execute('INSERT INTO users (name) VALUES (?)', ('Alice',))
cursor.execute('INSERT INTO users (name) VALUES (?)', ('Bob',))

# 提交事务
conn.commit()

# 查询数据
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()
for row in rows:
    print(row)

# 关闭连接
conn.close()

使用 psycopg2 模块

psycopg2 是用于PostgreSQL数据库的驱动程序。PostgreSQL支持所有标准的事务隔离级别。

示例:在 psycopg2 中使用事务隔离

import psycopg2

# 连接到PostgreSQL数据库
conn = psycopg2.connect(
    dbname='yourdbname',
    user='yourusername',
    password='yourpassword',
    host='localhost'
)

# 设置隔离级别为 Read Committed
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED)

cursor = conn.cursor()

# 创建表
cursor.execute('''CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name VARCHAR(100))''')

# 开始事务
conn.autocommit = False

# 插入数据
cursor.execute('INSERT INTO users (name) VALUES (%s)', ('Alice',))
cursor.execute('INSERT INTO users (name) VALUES (%s)', ('Bob',))

# 提交事务
conn.commit()

# 查询数据
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()
for row in rows:
    print(row)

# 关闭连接
conn.close()

使用 SQLAlchemy ORM

SQLAlchemy 是一个强大的Python SQL工具包和ORM框架,支持多种数据库。它也提供了对事务和隔离级别的支持。

示例:在 SQLAlchemy 中使用事务隔离

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

# 定义模型
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)

# 创建数据库引擎
engine = create_engine('postgresql+psycopg2://yourusername:yourpassword@localhost/yourdbname')

# 创建表
Base.metadata.create_all(engine)

# 创建会话
Session = sessionmaker(bind=engine)
session = Session()

# 设置事务隔离级别为 Repeatable Read
session.connection().connection.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_REPEATABLE_READ)

# 开始事务
session.begin()

# 插入数据
session.add(User(name='Alice'))
session.add(User(name='Bob'))

# 提交事务
session.commit()

# 查询数据
users = session.query(User).all()
for user in users:
    print(user.id, user.name)

# 关闭会话
session.close()

事务隔离的应用场景

防止脏读

在银行系统中,防止读取到未提交的转账记录。

# 读取转账记录前设置隔离级别为 Read Committed
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED)

防止不可重复读

在电商系统中,确保用户查看购物车时不会看到不同的商品价格。

# 查看购物车前设置隔离级别为 Repeatable Read
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_REPEATABLE_READ)

防止幻读

在数据统计系统中,确保统计数据时不会出现新增或删除的记录。

# 统计数据前设置隔离级别为 Serializable
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE)

总结

本文详细介绍了Python中事务隔离的概念和实现方法,涵盖了未提交读、提交读、可重复读和可串行化四种隔离级别。通过具体示例,展示了如何在SQLite、PostgreSQL和SQLAlchemy中设置和使用这些隔离级别,以防止脏读、不可重复读和幻读等数据并发问题。掌握这些技巧可以帮助在开发过程中更好地管理数据库事务,确保数据的一致性和完整性,提高系统的可靠性和性能。


Python学习路线

在这里插入图片描述

更多资料获取

📚 个人网站:ipengtao.com

如果还想要领取更多更丰富的资料,可以点击文章下方名片,回复【优质资料】,即可获取 全方位学习资料包。

在这里插入图片描述
点击文章下方链接卡片,回复【优质资料】,可直接领取资料大礼包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2041337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java海康门禁设备 对接人脸下发API

海康门禁机设备API接口对接 引言: 我本人在对接海康门禁机设备的时候遇到了两个 问题1:人脸下发失败的问题,是根据官方的Demo,遇到的问题,可以参考一下 这个问题我排查了很久,最终发现是海康给的Demo里面…

EasyX自学笔记3(割草游戏2)

在上一篇笔记之中我们还留有许多bug,如派蒙不会转头、派蒙是鬼没影子、斜向速度过快、会跑出界外的问题在此一并处理。 在上一章里我们知道需要玩家类、敌人类、子弹类三种,但是其包含的是他们的运行逻辑和变量。而播放动画帧也有许多函数我们也将其封装…

学习Java的日子 Day68 jQuery操作节点,Bootstrap

jQuery 1.jQuery操作DOM DOM为文档提供了一种结构化表示方法,通过该方法可以改变文档的内容和展示形式 在访问页面时,需要与页面中的元素进行交互式的操作。在操作中,元素的访问是最频繁、最常用的,主要包括对元素属性attr、内容…

《Hadoop大数据技术与实践》+ 数仓版本

基础概念 随着数字化时代的到来,数据量的爆炸性增长使得传统的数据处理和分析方法变得不够高效,因此大数据技术应运而生。 数据分类 结构化数据:固定格式的SQL数据库等半结构化数据:json非结构化数据:图片、音视频 …

探索sqlmap的奥秘:Python中的强大SQL注入检测工具

文章目录 **探索sqlmap的奥秘:Python中的强大SQL注入检测工具**第一部分:背景介绍第二部分:sqlmap是什么?第三部分:如何安装sqlmap?第四部分:简单库函数使用方法第五部分:场景应用第…

Grafana+Influxdb(Prometheus)+Apache Jmeter搭建可视化性能测试监控平台

此性能测试监控平台,架构可以是: GrafanaInfluxdbJmeterGrafanaPrometheusJmeter Influxdb和Prometheus在这里都是时序性数据库 在测试环境中,压测数据对存储和持久化的要求不高,所以这里的组件可以都通过docker-compose.yml文件…

制氧机在造纸工业中的作用

在现代造纸工业中,制氧机扮演着至关重要的角色,为整个生产流程带来了诸多显著的优势和改进。 制氧机能够优化纸浆的漂白过程。传统的漂白方法可能效果不佳,且对环境造成较大压力。而通过制氧机制备的高纯度氧气参与漂白反应,能大大…

Langchain pandas agent - Azure OpenAI account

题意:Langchain pandas代理 - Azure OpenAI账户 问题背景: I am trying to use Langchain for structured data using these steps from the official document. 我正在尝试使用 Langchain 处理结构化数据,按照官方文档中的这些步骤进行操作…

软件测试第2章 黑盒测试和白盒测试对比

目录 一、黑盒测试 二、白盒测试 三、黑盒测试 VS 白盒测试 一、黑盒测试 1、它只检查程序功能是否能按照需求规格说明书的规定正常使用,程序是否能适当地接受输入数据而产生正确的输出信息。 2、黑盒测试也称功能测试,通过测试来检测每个功能是否能…

《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(4)-再识Wireshark

1.简介 按照以前的讲解和分享路数,宏哥今天就应该从外观上来讲解WireShark的界面功能了。 2.软件界面 由上到下依次是标题栏、主菜单栏、主菜单工具栏、显示过滤文本框、打开区、最近捕获并保存的文件、捕获区、捕获过滤文本框、本机所有网络接口、学习区及用户指…

文件上传漏洞(三,靶场详解)

前言: 本文基于github上的upload-labs,PHP study以及bp抓包软件进行操作。 靶场环境搭建及pass-1.pass-2请转到:文件上传漏洞(二,靶场搭建及漏洞利用) 一,pass-3。 查看源码可知&#xff0c…

OJ-0815

题目 示例1 输入 bb1234aa 输出 10示例2 输入 bb12-34aa 输出 -31示例3 输入 bb0012-0034aa 输出 -31题解 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);long res 0;String s scanner…

在WinCC(TIA Portal)项目中,如何正确的使用面板,模板,弹出窗口和滑入窗口?

WinCC(TIA Portal)中提供了许多设计元素和组态对象,使得组态工作变得简单,文档中简要介绍了这些内容. WinCC(TIA Portal) 中提供了许多设计元素和组态对象,使得组态工作变得简单,文档中简要介绍了这些内容。 在 WinCC(TIA Portal) 中使用以下选项有助于提高组态过程…

git是什么/基本指令

git作用 去中心化, 分布式版本控制器 新增术语:仓库区, 工作区, 暂存区 具体见下板书 常用git命令 git clone 仓库网址 git status 查看仓库状态 git add newfile 临时添加到git仓库 git commit -m 正式添加git仓库 g…

电商SaaS聚水潭上市“求解”

时隔半年之后,电商ERP龙头聚水潭,再次向港交所递交主板上市申请,中金公司、摩根大通成为其联席保荐人。作为辅助电商商家运营的SaaS,其所提供的服务,主要包括库存分配、店铺管理、客户服务等诸多项目。作为国内最大的电…

机械行业数字化生产供应链产品解决方案(七)

在机械行业的数字化生产供应链产品解决方案中,通过全面部署物联网(IoT)传感器、智能分析平台和自动化控制系统,实现对生产设备的实时监控和数据采集,并结合大数据和人工智能技术进行深度分析,从而优化生产调…

AI绘画Stable Diffusion可以帮我做室内设计啦!把AI出图 应用到工作当中已经是人人必备的技能啦!

哈喽大家好,我是画画的小强 今天给大家带来个有意思教程,就是AI绘画Stable Diffusion 辅助帮我做室内设计! 在本篇文章中我们可以把Stable Diffusion 当做一个小的渲染器来用,帮助我们快速出图,以及快速的出概念的创…

【网络】应用层协议-http协议

应用层协议-http协议 文章目录 1.Http协议1.1什么是http协议1.2认识URL1.3urlencode和urldecode1.4HTTP请求协议格式1.5HTTP响应协议格式1.6HTTP常见的Header1.7HTTP常见状态码1.8HTTP的方法1.8根据url调取对应的服务 2.cookie和session2.1cookie2.2session 3.HTTPS协议3.1对称…

【Linux入门】Linux环境搭建

目录 前言 一、发行版本 二、搭建Linux环境 1.Linux环境搭建方式 2.虚拟机安装Ubuntu 22.02.4 1)安装VMWare 2)下载镜像源 3)添加虚拟机 4)换源 5)安装VM Tools 6)添加快照 总结 前言 Linux是一款自由和开放…

notepad++安装HexEdit插件

notepad安装HexEdit插件 打开notepad,选择插件—>插件管理 在这里找到HexEdit点击安装就可以 点击完,notepad会自动重启,重启完成就安装好了