理解数据库事务和回滚:概念、实例与Python脚本实现

文章目录

    • 概念
    • 银行案例实践
      • 创建数据
      • Python脚本中的事务回滚
    • 结语:保障数据安全与完整性的关键

概念

  • 事务(Transaction): 数据库中的事务是一组不可分割的操作集合,它们要么全部成功,要么全部失败。这个概念保证了数据的完整性和一致性。
  • 回滚(Rollback): 当事务中的一个或多个操作失败时,回滚机制会撤销所有已执行的操作,将数据库恢复到事务开始前的状态。这是一种错误恢复机制。
  • 提交(Commit): 如果事务中的所有操作都成功完成,那么事务会被提交,其结果会永久地保存在数据库中。
  • ACID属性:
    1)原子性(Atomicity): 确保事务中的所有操作都作为一个整体来执行。
    2)一致性(Consistency): 事务的执行保证了数据库从一个一致的状态转移到另一个一致的状态。
    3)隔离性(Isolation): 确保并发执行的事务彼此独立,不会相互干扰。
    4)持久性(Durability): 一旦事务提交,其结果在数据库中持久保存。

银行案例实践

创建数据

本例中,我们创建一个名为 accounts 的表,包含 account_id(账户ID,作为主键)和 balance(账户余额)两个字段。脚本将插入两个账户A和B,各自具有特定的初始余额。

-- 创建银行账户表
CREATE TABLE test.accounts (account_id VARCHAR(10) PRIMARY KEY,balance DECIMAL(10, 2) NOT NULL
);-- 插入初始数据
INSERT INTO test.accounts (account_id, balance) VALUES ('A', 1000.00);  -- 假设账户A有1000元
INSERT INTO test.accounts (account_id, balance) VALUES ('B', 500.00);   -- 假设账户B有500元

Python脚本中的事务回滚

以下Python脚本演示了如何在数据库操作中使用事务。脚本开始于 connection.begin(),标志着事务的开始,并尝试执行两个账户间的转账操作。任何操作的失败都将触发异常,执行 connection.rollback(),撤销所有更改。若操作成功,则通过 connection.commit() 提交事务。

import pandas as pd
import pymysql
from credentials import get_credentials
import datetimedef connect_to_database():credentials = get_credentials()connection = pymysql.connect(host='localhost',user=credentials['username'],password=credentials['password'],database='test',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor)try:with connection.cursor() as cursor:current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")print(f"{current_time} - 开始事务")connection.begin()sql_statements = ["UPDATE accounts SET balance = balance - 100 WHERE account_id = 'A'","UPDATE accounts SET balance = balance + 100 WHERE account_id = 'B'","select * from accounts;"]for sql_statement in sql_statements:try:# 执行 SQL 语句cursor.execute(sql_statement)# 获取查询结果result = cursor.fetchall()df = pd.DataFrame(result)current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")print(f"{current_time} - 正在执行sql: {sql_statement}")print(f"{current_time} - 查询结果如下:")print(df)except pymysql.MySQLError as e:# 发生错误时记录错误并准备回滚current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")print(f"{current_time} - SQL 错误: {e}")connection.rollback()print("Transaction rolled back.")return  # 结束函数,不再执行后续操作# 提交事务current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")print(f"{current_time} - 提交事务")connection.commit()except Exception as e:current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")print(f"{current_time} - 外部错误: {e}")connection.rollback()print("Transaction rolled back.")finally:connection.close()if __name__ == "__main__":connect_to_database()

此外,为了安全地管理数据库凭证,我们使用 get_credentials.py 模块,以存储和获取数据库用户名和密码。


# 测试:这里存放数据库用户名和密码
def get_credentials():# 替换成你实际的用户名和密码credentials = {'username': 'root','password': 'yanghanwen123'}return credentials

结语:保障数据安全与完整性的关键

通过本文,我们深入了解了数据库事务处理的核心概念和重要性。事务(Transaction)、回滚(Rollback)和提交(Commit)这些操作不仅是数据库管理的基础,也是确保数据安全、完整和一致性的关键。

重要性归纳:

  1. 数据完整性:事务确保了即使在出现错误或系统故障的情况下,数据库的完整性也不会受损。
  2. 错误恢复:回滚机制提供了一种有效的错误恢复路径,保护数据免受部分操作失败的影响。
  3. 并发控制:事务的ACID属性在并发环境中维持了数据的一致性和稳定性。

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

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

相关文章

Amazon CodeWhisperer 正式可用, 并面向个人开发者免费开放

文章作者:深度-围观 北京——2023年4月18日,亚马逊云科技宣布,实时 AI 编程助手 Amazon CodeWhisperer 正式可用,同时推出的还有供所有开发人员免费使用的个人版(CodeWhisperer Individual)。CodeWhisperer…

SAP ABAP Tree Control 对象与ALV Grid 对象关联

Tree Control 对象与ALV Grid 对象关联 在双击 Tree 对象时,变更ALV Trid 对象的显示,实现界面如图9-11 所示。 Screen 设计界面如图9-12 所示。 主程序: REPORT ytest36. DATA: ok_code TYPE sy-ucomm,save_ok TYPE sy-ucomm. DATA: wa_co…

【C++】map和set的使用及注意事项

map和set的使用及注意事项 1.关联式容器2. 键值对3.set3.1接口介绍3.1.1构造3.1.2迭代器3.1.3容量3.1.4修改 3.2set使用及注意事项 4.multiset5.map6.multimap349. 两个数组的交集 1.关联式容器 在初阶阶段,我们已经接触过STL中的部分容器,比如&#xf…

vue项目解决计算后浮点数精度问题

1.1 问题描述 计算出的结果本来应该为13.8386,但是这里因为js精度问题,导致后边多了一串的0000001。 1.2 使用场景 求和,每个物品的单价*数量 1.3 解决办法 引入第三方库Decimal 1.4 vue项目中Decimal安装步骤 1.4.1 安装Decimal np…

C语言枚举详解,typedef简介(能看懂文字就能明白系列)

系列文章目录 C语言基础专栏 笔记详解 🌟 个人主页:古德猫宁- 🌈 信念如阳光,照亮前行的每一步 文章目录 系列文章目录🌈 *信念如阳光,照亮前行的每一步* 前言一、枚举类型的声明枚举常量三、枚举类型的优…

索尼PMW580视频帧EC碎片重组开启方法

索尼PMW580视频帧EC碎片重组开启方法 索尼PMW-580摄像机生成的MXF文件存在严重的碎片化,目前CHS零壹视频恢复程序MXF版、专业版、高级版已经支持重组结构体正常的碎片,同时也支持对于结构体破坏或者覆盖后仅存在音视频帧EC数据的重组,需要注…

开关电源有哪些EMI整改?|深圳比创达电子EMC

某控制产品在进行辐射发射测试时,发现测试结果超标,辐射发射测试结果如下图所示: 控制产品在去掉发射源之前,就在各外部端口采取了各种滤波措施,结果并无明显作用,即使把所有相关外部引线全部拿走(只剩下电…

快速学习PyQt5的动画和图形效果

Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图(Item View) 快速弄懂Pyqt5的4种项目部件(Item Widget) 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器&…

菜鸟学习日记(python)——运算符

我们进行运算时,需要两类数据,操作数和运算符,例如:ab就是一个运算,它的操作数是a和b,运算符是‘’ 在python中运算符包括以下几大类: 算数运算符比较(关系)运算符赋值…

spark无法执行pi_如何验证spark搭建完毕

在配置yarn环境下的spark时,执行尚硅谷的以下命令发现报错,找不到这个也找不到那个,尚硅谷的代码是 bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master yarn \ --deploy-mode cluster \ ./examples/jars/spark-exam…

Android AIDL实现开放系统级API 提供三方app调用

需求场景 当上层app需要调用一些系统底层的资源以及属性操作(比如Settings.system 属性的读写),甚至驱动节点的读写操作,上层app毫无疑问是没有权限的,所以就需要我们在framework 系统层做一个中转和代理,也…

java 下载文件,复制文件

1,java通过浏览器下载文件 ApiOperation(value "导出", notes "", response String.class)GetMapping("/export")public HttpServletResponse export(String path, HttpServletResponse response) { // String path "…

Linux C语言 42-进程间通信IPC之网络通信(套接字)

Linux C语言 42-进程间通信IPC之网络通信(套接字) 本节关键字:C语言 进程间通信 网络通信 套接字 TCP UDP 相关库函数:socket、bind、listen、accept、send、recv、sendto、recvfrom 参考之前的文章 Linux C语言 30-套接字操作…

k8s部署单机模式的minio

k8s部署单机模式的minio 一、说明二、yaml内容三、步骤3.1 创建资源3.2 查看启动日志3.2 查看svc并访问控制台 一、说明 项目使用minio,准备在k8s环境部署一套minio试用。 1.关于minio的原理和概念参考: https://mp.weixin.qq.com/s?__bizMzI3MDM5NjgwNg&mid…

国防科技大博士招生入学考试【50+论文主观题】

目录 回答模板大意创新和学术价值启发 论文分类(根据问题/场景分类)数学问题Efficient Multiset Synchronization(高效的多集同步【简单集合/可逆计数Bloom过滤器】)大意创新和学术价值启发 An empirical study of Bayesian netwo…

Python中函数添加超时时间,Python中signal使用

from time import time, sleepimport signal# 模拟要删除5条数据,中间有超时的i 5# 超时后执行的方法def timeout_handler(signal, frame):# 引发异常raise TimeoutError("删除第" str(i) "条,超时!")# 或者执行其他操作,不往外抛异常(超时的函数不会被…

JAVA代码优化:字符串工具类

字符串工具类,提供了一系列处理字符串的常用方法,包括判空、截取、格式化、转换等功能。 nvl(T value, T defaultValue):用于获取参数不为空的值,如果参数为空则返回默认值。 isEmpty和isNotEmpty系列方法:用于判断集…

使用Spring Cloud搭建一个项目框架之父子模块的创建

前言 说实在的,Spring Cloud的这个系列,很多人都写过,写的比博主好的一大堆,网友们百度一下,就可以发现很多很多,甚至有一批都是系列文章,我只不过之前学过一段时间,但是过了一段时…

ubuntu 系统部署 Stable Video Diffusion

11月21日,stability.ai 发布了生成式视频模型 Stable Video Diffusion(SVD) 。 官方博客链接:Introducing Stable Video Diffusion — Stability AIgit地址:GitHub - Stability-AI/generative-models: Generative Mod…

Failure[ERROR_GET_BUNDLE_INSTALLER_FAILED]【Bug已解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析(Bug已找到原因):解决方案(Bug已解决):Bug解决总结项目场景: 在运行/调试过程中出现“Failure[ERROR_GET_BUNDLE_INSTALLER_FAILED]”错误。 报错如下: 11/17 11:14:05: Launching com.example.helloworld $ hdc shell am force-…