Python 操作mysql实现事务处理

一、应用场景

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.hqwc.cn/news/288579.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Navicat16的下载与安装

Navicat16的下载与安装 1、官网下载地址:https://www.navicat.com.cn/download/navicat-premium 当然有的朋友在官网下载比较慢,我也为大家准备好了百度网盘链接 链接:https://pan.baidu.com/s/1dUcTSHr3761Oayh0-WfolA?pwdwfpl 提取码&am…

【Java】常用的时间类API

目录 Date(时间和日期) SimpleDateFormat(解析字符串时间成为时间对象) Calendar(系统此刻时间对应的日历) LocalDate(年、月、日) LocalTime(时、分、秒) LocalDateTime(年、月、日、时、分、秒…

LeetCode 每日一题 Day 17 || 二分

1901. 寻找峰值 II 一个 2D 网格中的 峰值 是指那些 严格大于 其相邻格子(上、下、左、右)的元素。 给你一个 从 0 开始编号 的 m x n 矩阵 mat ,其中任意两个相邻格子的值都 不相同 。找出 任意一个 峰值 mat[i][j] 并 返回其位置 [i,j] 。 你可以假设整个矩阵周…

vue 如何实现拖动:vue-draggable

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

Python MySQL数据库连接实现增删改查

一、应用场景 python项目连接MySQL数据库时,需要第三方库的支持。这篇文章使用的是PyMySQL库,适用于python3.x。 二、安装 pip install PyMySQL三、使用方法 1.导入模块 import pymysql2.连接数据库 db pymysql.connect(hostlocalhost,usercode_s…

甄选的董宇辉,颠覆新东方?

董宇辉又被推向浪尖。 一年前,新东方老师董宇辉出现在东方甄选主播间,用边带货边教英文的方式爆火出圈,成为了东方甄选的活招牌。一年后,一条常规宣发物料引发一场巨大的舆情风波,董宇辉“小作文”事件如闹剧般展开&a…

Java研学-Tomcat服务器

一 Web资源 1 概述 浏览器网页上看到的所有内容都称为web资源,比如文字,图片,音频,视频,链接等等内容。 2 Web资源分类 分类概述使用的技术静态资源静态资源是相对于动态资源而言,是指没有后台数据库、不…

3ds Max渲染贴图丢失?这样操作就能搞定!

当你在使用3ds Max进行渲染时,有时候会遇到贴图丢失的问题,导致模型无法正常显示。这可能是因为你在导入模型或添加贴图时出现了一些错误。不过不用担心,接下来我将向你解释这个问题可能出现的几种原因,同时提供有效的解决方案。 …

视觉问答学习(对比学习-3D点云)

1、基于对比学习的方法 自监督学习,不需要人工标注的类别标签信息,而是利用数据本身提供的监督信息来学习样本数据的特征表达,并用于下游任务。在视觉语言表示学习中,通过对比学习实现图像-文本对齐,这种对齐策略能够…

Web请求与响应

目录 Postman Postman简介 Postman的使用 请求 简单参数 实体参数 数组参数 集合参数 日期参数 Json参数 路径参数 响应 ResponseBody 统一响应结果 Postman Postman简介 postman是一款功能强大的网页调试与发送网页http请求的Chrome插件,常用于进行…

怎么压缩图片大小?

怎么压缩图片大小?图片可以说是现在大家绕不开的一种文件,在我们日常的生活和工作中,图片大小成为了一个经常需要处理的问题。无论是在文件插入、上传还是发送图片时,我们往往都会受到图片大小的限制。现在不管手机还是相机的像素…

2 python基本语法 - Tuple不可变序列

1 元组的概念 元组(tuple)是一个有序且不可更改的集合,允许重复。元组(tuple)是 Python 中一个重要的序列结构,和列表类似,元组也是由一系列按特定顺序排序的元素组成。元组和列表(…