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

一、前置条件

在mysql数据库生成数据:

CREATE DATABASE mydatabase;

CREATE TABLE Course (
    CourseID INT PRIMARY KEY,
    CourseName VARCHAR(100),
    Instructor VARCHAR(100),
    Credits INT,
    StudentID INT,
    FOREIGN KEY (StudentID) REFERENCES StudentInformation(StudentID)
);

INSERT INTO CourseInformation (CourseID, CourseName, Instructor, Credits, StudentID)
VALUES
    (1, 'Math', 'John', 3, 1),
    (2, 'English', 'Sarah', 2, 2),
    (3, 'Physics', 'David', 4, 3),
    (4, 'Chemistry', 'Emily', 3, 1);

python执行非查询语句:

import pymysql

# 创建连接
conn = pymysql.connect(host="127.0.0.1",    # 参数根据实际数据填写
                       port=3306,
                       user="root",
                       password="root",
                       database="mydatabase")

# 创建游标
cursor = conn.cursor()

# 执行增加数据sql语句
sql = "insert into course(CourseID,CourseName,Instructor) values(5,'语文','xu');"
cursor.execute(sql)

# 删除游标
cursor.close()

# 删除连接
conn.close()

二、执行效果

pymysql执行非查询语句会自动提交事务,关闭事务自动提交_第1张图片

三、原因分析

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

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

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

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

# 查看当前数据库支持的存储引擎
show ENGINES;

# 查看指定数据库所有表使用的存储引擎
show table status from 库名;    

# 查看指定表的存储引擎
show create table 表名;

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

四、结论

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

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

  • 事务提交(2选1):
1、conn = pymysql.connect(host="127.0.0.1",
                          port=3306,
                          user="root",
                          password="root",
                          database="mydatabase",
                          autocommit=True)    # 开启自动提交


2、conn.commit()    # 事务提交,conn是数据库连接对象
  • 事务回滚:
conn.rollback()    # 事务回滚,conn是数据库连接对象

你可能感兴趣的:(python,软件测试,数据库,mysql)