MySQL事务的操作及其特性

本文介绍了MySQL事务的基本概念和操作,包括原子性、一致性和隔离性的四大特性,以及持久性。通过Python使用pymysql库执行SQL展示了如何进行事务处理,如开启、提交和回滚事务。同时,讨论了并发事务可能引发的问题,如脏读、不可重复读和幻读,并详细解释了不同的事务隔离级别及其对这些问题的影响。
摘要由CSDN通过智能技术生成

MySQL事务

  • 本文用python执行SQL语句。
    导入python库
import json
import pymysql
from pymysql.converters import escape_string
import pandas as pd

连接数据库

#连接数据库
conn=pymysql.connect(
    host="localhost",
    port=3306,#端口号
    user="root",#数据库用户
    password="123456",#数据库密码
    #database="world"#要连接的数据库名称
)
cur=conn.cursor()

跳转到指定数据库

sql = """USE PLJNB"""
cur.execute(sql)
cur.fetchall()

创建实验数据表:

sql = """
    CREATE TABLE account(
        id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
        name VARCHAR(10) COMMENT '姓名',
        money INT COMMENT '余额'
    )COMMENT '账户表';
"""
cur.execute(sql)
conn.commit()
cur.fetchall()

事务的概念

  • 事务是一组操作的集合,是一个不可分割的工作单位。
  • 事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即同时成功或同时失败。

事务操作

查看事务提交方式
  • 1为自动提交,0为手动提交
SELECT @@autocommit;
设置事务提交方式
SET @@autocommit = 0;
开启事务
START TRANSACTION 

BEGIN;
提交事务
COMMIT;
回滚事务
ROLLBACK;

例:将用户转账操作原子化

try:
    sql = """
    START TRANSACTION;
    """
    cur.execute(sql)
    
    sql = """
        SELECT * FROM account WHERE name = 'plj';
    """
    cur.execute(sql)

    sql = """
        UPDATE account SET money = money - 1000 WHERE name = 'plj';
    """
    cur.execute(sql)

    sql = """
        UPDATE account SET money = money + 1000 WHERE name = 'pljnb';
    """
    cur.execute(sql)

    sql = """
        COMMIT;
    """
    cur.execute(sql)
except:
    sql = """
        ROLLBACK;
    """
    cur.execute(sql)

事务的四大特性

原子性

事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

一致性

事务完成时,必须使所有的数据都保持一致状态。

隔离性

数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

持久性

事务一旦提交或回归,他对数据库中的数据的改变是永久的。

并发事务问题

脏读

一个事务读到另外一个事务还没有提交的数据

不可重复读

一个事务先后读取同一条记录,但两次读取的数据不同

幻读

一个事务查询数据时没有对应数据行,插入数据时发现数据已存在

事务隔离级别

查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

例:

sql = """
    SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
"""
cur.execute(sql)
cur.fetchall()
各事务隔离级别会出现的并发事务问题
事务隔离级别脏读不可重复读幻读
read uncommitted
read committed×
repeatable read(默认)××
serializable×××
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值