【mysql 数据库事务】开启事务操作数据库,写入失败后,不回滚,会有问题么? 这里隐藏着大坑,复试,面试时可以镇住面试老师!!!!

本文主要是介绍【mysql 数据库事务】开启事务操作数据库,写入失败后,不回滚,会有问题么? 这里隐藏着大坑,复试,面试时可以镇住面试老师!!!!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

建表字段:

CREATE TABLE `user` (`id` INT(11) NOT NULL AUTO_INCREMENT,`nickname` VARCHAR(32) NOT NULL COLLATE 'utf8mb4_general_ci',`email` VARCHAR(32) NOT NULL COLLATE 'utf8mb4_general_ci',`status` SMALLINT(6) UNSIGNED NULL DEFAULT NULL,`password` VARCHAR(256) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `ix_user_nickname` (`nickname`) USING BTREE,UNIQUE INDEX `ix_user_email` (`email`) USING BTREE
)
COLLATE='utf8mb4_general_ci'

要注意status是unsigned的smallint
待会就从这里制造写入update失败

看下数据库的版本和隔离级别

select version();
select  @@transaction_isolation;

版本:5.7.26
隔离级别是默认的 RR:REPEATABLE-READ, 四个隔离级别自行百度学习


begin;INSERT INTO user values(NULL,7,7,7,7);
UPDATE user SET STATUS = -1 WHERE nickname=7;COMMIT;
ROLLBACK;

插入 7777 然后 update status = -1 会失败
在这里插入图片描述

此时先select 表,


SELECT * FROM user;

在这里插入图片描述
可以看到当前session下是插入了。
再在python侧验证一下是否真的插入成功了:
在这里插入图片描述
是空。

然后再sqlyou管理端执行插入insert

INSERT INTO user values(NULL,8,8,8,8);

在这里插入图片描述
可以成功!但是这可能是当前session下的幻觉~ 再再python侧验证
still,空空入也
在这里插入图片描述
再再sqlyou 管理端执行rollback

在这里插入图片描述
7777 和 8888 都没有了。
其实不rollback的话,sqlyou侧只有在重启数据库后才能发现这个问题,或者重启一个session也能。
验证:
在这里插入图片描述
果然如此

TRUNCATE user
下面我再python侧单独写个case再验证下:


# @Time      :2024-2024/2/27-23:08
# @Author    :Justin
# @Email     :514422868@qq.com
# @file      :check_transition_mysql.py
# @Software  :01-fishbook
import pymysql# 创建数据库连接
connection = pymysql.connect(host='localhost',user='root',password='123456',database='yushu_book1',cursorclass=pymysql.cursors.DictCursor)try:# 创建游标with connection.cursor() as cursor:connection.begin()# 插入记录insert_query = "INSERT INTO user VALUES (NULL,7,7,7,7)"cursor.execute(insert_query)# 更新记录update_query = "UPDATE user SET status = -1 WHERE nickname=7"cursor.execute(update_query)connection.commit()  # 提交事务except Exception as error:print(f"发生错误: {error}")finally:print("-------")# connection = pymysql.connect(host='localhost',#                              user='root',#                              password='123456',#                              database='yushu_book1',#                              cursorclass=pymysql.cursors.DictCursor)# connection.rollback()with connection.cursor() as cursor:select_query = "select * from user where nickname='7'"cursor.execute(update_query)results = cursor.fetchall()print(results)# 关闭连接connection.close()

屏蔽 # connection.rollback() 用原先的connection是会报错

发生错误: (1264, "Out of range value for column 'status' at row 1")
-------
Traceback (most recent call last):File "D:\code\python_project\01-fishbook\test\check_transition_mysql.py", line 40, in <module>cursor.execute(update_query)File "C:\ProgramData\Anaconda3\lib\site-packages\pymysql\cursors.py", line 148, in executeresult = self._query(query)File "C:\ProgramData\Anaconda3\lib\site-packages\pymysql\cursors.py", line 310, in _queryconn.query(q)File "C:\ProgramData\Anaconda3\lib\site-packages\pymysql\connections.py", line 548, in queryself._affected_rows = self._read_query_result(unbuffered=unbuffered)File "C:\ProgramData\Anaconda3\lib\site-packages\pymysql\connections.py", line 775, in _read_query_resultresult.read()File "C:\ProgramData\Anaconda3\lib\site-packages\pymysql\connections.py", line 1156, in readfirst_packet = self.connection._read_packet()File "C:\ProgramData\Anaconda3\lib\site-packages\pymysql\connections.py", line 725, in _read_packetpacket.raise_for_error()File "C:\ProgramData\Anaconda3\lib\site-packages\pymysql\protocol.py", line 221, in raise_for_errorerr.raise_mysql_exception(self._data)File "C:\ProgramData\Anaconda3\lib\site-packages\pymysql\err.py", line 143, in raise_mysql_exceptionraise errorclass(errno, errval)
pymysql.err.DataError: (1264, "Out of range value for column 'status' at row 1")

也就是说,同一个connnection下,或者回滚,或者重新获取连接!!

结论:

python侧,不rollback的话,取决于系统中的代码是否复用了上面的数据库连接,若复用了则走不动,会报错。不复用则能继续往下走。并且不会产生幻读,因为新的connection,就是看不到啊。

这篇关于【mysql 数据库事务】开启事务操作数据库,写入失败后,不回滚,会有问题么? 这里隐藏着大坑,复试,面试时可以镇住面试老师!!!!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/755873

相关文章

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3