• pymysql执行非查询语句会自动提交事务,关闭事务自动提交


    一、前置条件

    mysql数据库生成数据:

    1. CREATE DATABASE mydatabase;
    2. CREATE TABLE Course (
    3. CourseID INT PRIMARY KEY,
    4. CourseName VARCHAR(100),
    5. Instructor VARCHAR(100),
    6. Credits INT,
    7. StudentID INT,
    8. FOREIGN KEY (StudentID) REFERENCES StudentInformation(StudentID)
    9. );
    10. INSERT INTO CourseInformation (CourseID, CourseName, Instructor, Credits, StudentID)
    11. VALUES
    12. (1, 'Math', 'John', 3, 1),
    13. (2, 'English', 'Sarah', 2, 2),
    14. (3, 'Physics', 'David', 4, 3),
    15. (4, 'Chemistry', 'Emily', 3, 1);

    python执行非查询语句

    1. import pymysql
    2. # 创建连接
    3. conn = pymysql.connect(host="127.0.0.1", # 参数根据实际数据填写
    4. port=3306,
    5. user="root",
    6. password="root",
    7. database="mydatabase")
    8. # 创建游标
    9. cursor = conn.cursor()
    10. # 执行增加数据sql语句
    11. sql = "insert into course(CourseID,CourseName,Instructor) values(5,'语文','xu');"
    12. cursor.execute(sql)
    13. # 删除游标
    14. cursor.close()
    15. # 删除连接
    16. conn.close()

    二、执行效果

    三、原因分析

    1、python代码没有开启自动提交,默认autocommit=False

    2、mysql默认开启了自动提交,autocommit=1(SELECT @@autocommit;),但是执行

    set autocommit=0后再次执行该python代码,仍然会自动提交事务即成功添加数据

    3、查询数据表的存储引擎

    1. # 查看当前数据库支持的存储引擎
    2. show ENGINES;
    3. # 查看指定数据库所有表使用的存储引擎
    4. show table status from 库名;
    5. # 查看指定表的存储引擎
    6. show create table 表名;

    发现上面sql语句生成的数据表默认的存储引擎是MyISAM,经查询MyISAM不支持事务,需要换成支持事务的存储引擎

    四、结论

            使用sql语句没有指定存储引擎会默认使用MyISAM引擎,该引擎不支持事务,需要换成支持事务的存储引擎,例如:Mysql 的InnoDB

            切换到支持事务的引擎之后,使用上述sql语句执行后,MySQL会将这些修改暂时存储在内存中,这些修改被称为"未提交的数据"。在事务提交之前,所有的修改都不会被写入到磁盘上的数据文件中,而是存储在内存中的缓冲区中,只有进行事务的提交或回滚操作才会将执行的结果写入到磁盘上的数据文件中

    • 事务提交(2选1):
    1. 1、conn = pymysql.connect(host="127.0.0.1",
    2. port=3306,
    3. user="root",
    4. password="root",
    5. database="mydatabase",
    6. autocommit=True) # 开启自动提交
    7. 2、conn.commit() # 事务提交,conn是数据库连接对象
    • 事务回滚:
    conn.rollback()    # 事务回滚,conn是数据库连接对象
  • 相关阅读:
    云计算如何助力夯实制造业“底盘”?材料科学领域专家学者分享新材料前沿技术成果
    BGR 顺序中的 OpenCV-color
    Java面试八股之什么是mybatis流式查询
    leetCode 72. 编辑距离 动态规划 + 滚动数组 + 优化空间
    20000 字的 Spring Cloud 总结,太硬核了
    代谢组学文献分享:地中海饮食、血浆代谢组和心血管疾病风险
    redis 持久化
    《LeetCode力扣练习》代码随想录——字符串(KMP算法学习补充——针对next数组构建的回退步骤进行解释)
    【C++】类和对象(中)
    11、Vue的生命周期
  • 原文地址:https://blog.csdn.net/ouihsiad/article/details/133145803