Python 操作mysql实现事务处理

news2024/9/25 7:19:51

一、应用场景

Python项目对MySQL数据库进行增、删、改操作时,有时会出现执行sql异常的情况。在批量提交数据的时候,如果其中一个事务提交错误,往往导致预期的整个数据链不完整。
例如银行转账数据,用户A向用户B转账:

  • 步骤一:此时A的数据要存一份某个时间向B转账的数据。

  • 步骤二:同时用户B也会存一份某个时间收到A转账的数据。

如果此时步骤一执行sql成功,步骤二出错并且未回滚事务,将会导致两边备份的数据校对错误。当引入事务时,步骤二出现错误,事务回滚后步骤一未执行,数据回归到出错前的情况,保证了数据的安全性。

二、使用方法

配合我们之前文章提到的try的使用(Python之异常处理(try的基本用法)),还有上篇文章学到的mysql的基本操作(Python MySQL数据库连接)实现捕捉异常并且回滚。

try:
    cursor.execute(sql_1)  
    cursor.execute(sql_2)  
    cursor.execute(sql_3)  
except Exception as e:
		# 事务回滚
    connect.rollback()  
    print('事务处理失败', e)
else:
		# 事务提交
    connect.commit()  
    print('事务处理成功', cursor.rowcount)

三、测试demo

事务出现错误demo

# -*- coding: utf-8 -*-

import pymysql
if __name__ == '__main__':
    db = pymysql.connect(host='localhost',
                         user='root',
                         password='root',
                         database='others')

    cursor = db.cursor(pymysql.cursors.DictCursor)
    select_sql = " select id,name from user_info "
    cursor.execute(select_sql)
    data_list = cursor.fetchall()
    print("执行更新前的数据-->")
    print(data_list)

    try:
        update_sql1 = " update user_info set name='1:code_space' where id = 1 "
        update_sql2 = " update user_info set name='2:code_space' where id = 2 "
        # 数据库的name长度是20,这里长度超过了,会报Data too long错误
        update_sql3 = " update user_info set name='测试测试测试测试测试测试测试测试测试测试测试测试' where id = 3 "
        
				cursor.execute(update_sql1)
        cursor.execute(update_sql2)
        cursor.execute(update_sql3)

    except Exception as e:
        # 事务回滚
        db.rollback()
        print('事务处理失败', e)
    else:
        # 事务提交
        db.commit()
        print('事务处理成功', cursor.rowcount)

    cursor.execute(select_sql)
    data_list = cursor.fetchall()
    print("执行更新后的数据-->")
    print(data_list)

    cursor.close()
    db.close()

在这里插入图片描述

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

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

相关文章

blast安装及简单使用

一、安装blast 1.Ubuntu环境 # 下载blast wget https://ftp.ncbi.nlm.nih.gov/blast/executables/blast/2.9.0/ncbi-blast-2.9.0-x64-linux.tar.gz # 解压blast压缩包 tar -xzvf ncbi-blast-2.9.0-x64-linux.tar.gz # 测试 ./bin/blastp -h 这里就代表安装成功了,…

Mac电脑上设置一位数密码

1. 打开“终端”应用程序,你可以在 “ 应用程序 ” 文件夹中找到它。 2. 在终端窗口中,输入以下命令并按下回车键 pwpolicy -clearaccountpolicies 这个命令的目的是清除全局账户策略,允许设置较低位数的密码。 3. 输入你的开机密码并按下…

springCould-从小白开始【1】

目录 1.说明 2.父工程 3.服务端 4.消费者 5.公共模块 6.RestTemplate 1.说明❤️❤️❤️ 创建三个模块,服务者,消费者,公共api 注:spring boot和spring cloud有版本约束 2.父工程 ❤️❤️❤️ 约定版本号配置 注意&…

GSCoolink GSV1201E Type C/DP1.2转HDM1.4

DisplayPort 1.2 to HDMI 1.4 Converter with Embedded MCU 功能特征 1、GSV1201E是一款高性能、低功耗、USB Type-C Alternate Mode DisplayPort 1.2 to HDMI 1.4转换器。 2、显示接口接收器支持21.6Gbps(HBR2,4-lane)。 3、HDMI发射器支持9Gbps(TMDS3G3Lane)。…

OpenHarmony南向之TP触摸屏

概述 Touchscreen驱动用于驱动触摸屏使其正常工作,该驱动主要完成如下工作:对触摸屏驱动IC进行上电、配置硬件管脚并初始化其状态、注册中断、配置通信接口(I2C或SPI)、设定Input相关配置、下载及更新固件等操作。 Touchscreen驱…

mysql:查看线程缓存中的线程数量

使用命令show global status like Threads_cached;可以查看线程缓存中的线程数量。 例如,查询线程缓存中的线程数量如下: 然后启动应用程序,使用连接,查询如下: 由查询结果可以看到,线程缓存中的线程数量…

人工智能时代,看好硅光子!

硅光子学是一种用于制备光子集成电路(PIC)的技术,通常用于产生、检测、传输和处理光。这种方法使用半导体绝缘体上硅(SOI)晶片作为衬底材料,并采用标准的互补金属氧化物半导体(CMOS)…

弧形导轨的类型及应用

弧形导轨又叫圆弧形导轨,滚轮弧形导轨,是通过V型滚轮在圆弧形V型导轨面上的滚动,实现圆周运动;在工业自动化中,有些应用需要弧线运动,或者两个相交或平行的直线运动,这些情况需要通过弧线运动连…

netsdk1004 找不到资产文件“d:\vs-code\consoleapp1\consoleapp1\obj\project.assets.json”

今天学C#遇到一个问题记录下 创建如上所示的项目后运行出错: netsdk1004 找不到资产文件“d:\vs-code\consoleapp1\consoleapp1\obj\project.assets.json”。运行 nuget 包还原以生成此文件。 consoleapp1 c:\program files\dotnet\sdk\8.0.100\sdks\microsoft.net…

pyCharm 创建一个FastApi web项目,实现接口调用

FastApi和Django区别 我这边演示项目使用的fastApi作为web框架,当然主流一般都是使用Django做web框架,但是Django是一个重量级web框架他有很多组件,如授权,分流等全套web功能。我这边呢只需要有个接口可以被别人调用,…

脉冲水表和光电直读水表有什么区别?

脉冲水表和光电直读水表是两种常见的水表类型,它们在原理和功能上有着一些明显的区别。在本文中,我们将探讨脉冲水表和光电直读水表的区别,并讨论它们各自的优势和适用场景。 首先,我们来看看脉冲水表。脉冲水表是一种机械式水表&…

Python列表操作详解,多种方式删除首元素

更多资料获取 📚 个人网站:ipengtao.com 在Python中,处理列表的操作是日常开发中不可避免的任务之一。其中,删除列表中的元素是一个常见的需求,而删除第一个元素更是一个特殊的场景。本篇博客将详细介绍Python中多种方…

C++ Qt开发:TabWidget实现多窗体功能

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TabWidget标签组件的常用方法及灵活运用。 Q…

3D可视化大屏:赋能行业数据可视化应用,让数据更鲜活

互联网时代,各种数据信息充斥在我们的生活中,对于大量的数据,我们也需要大量的时间才能去分析理解,因此3D可视化大屏的展示无疑是令人兴奋的进步。3D数据大屏能够将数据以更加直观、更加生动的方式呈现出来,结合VR全景…

vue 如何实现拖动:vue-draggable

vue-draggable 官方文档:传送门 特点: 支持触摸设备(如vue项目的移动端开发Quasar)支持拖拽和选择文本支持不同列表之间的拖拽视图模型的同步刷新与vue2的过渡动画(transition-group)兼容有很多监听函数…

【算法刷题】Day21

1. 【模板】前缀和 原题链接 题干: 给定一个长度为 n 的数组 有 q 次查询,每次有两个参数 l 和 r 算法原理: 1. 暴力解法 (模拟) 这个时间复杂度是 O(n) 2. 前缀和(快速求出数组中某一个连续区间的和&…

猫粮什么品牌好?业内人生分享五个口碑好质量好主食冻干猫粮牌子

随着养猫的人越来越多,铲屎官们对猫咪的饮食也越来越注重。除了猫粮,很多铲屎官还会给猫咪准备小零食。那么,猫咪是不是除了猫粮就没有其他可吃的了呢?答案当然不是。猫咪还有猫冻干、冻干猫粮、猫条等可以选择。每个铲屎官都希望…

ShellExecute打开网页

效果图: 相关代码: void Open_url::on_pushButton_clicked() {QString path1 "explorer.exe";QString urlui->lineEdit->text();ShellExecute(NULL, L"open", path1.toStdWString().c_str(), url.toStdWString().c_str(), NULL, SW_SHO…

【QT】Model/View结构

目录 1 概述 2 Mode/View基本原理 3 数据模型 4 视图组件 5 代理 6 Model/View结构的一些概念 6.1 Model/View的基本结构 6.2 模型索引 6.3 行号和列号 6.4 父项 6.5 项的角色 1 概述 Model/View(模型/视图)结构是Qt中用界面组件显示与编辑数据的一种结构…

HAproxy做七层代理+keepalived高可用,实现动静分离,由nginx处理静态页面,tomcat处理动态页面

目录 一、三种软负载均衡器的区别 关于三种负载均衡器的性能对比: 关于三种负载均衡器的代理类型对比: 关于三种负载均衡器的健康检查对比: 二、haproxy的8中负载均衡调度算法 haproxy的会话保持的方式 haproxy的配置文件学习 三、实操…