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 | × | × | × |