您的当前位置:首页正文

MySQL数据库—事务(详解事务四大特性、并发事务问题以及事务的隔离级别,附有案例)

2024-11-29 来源:个人技术集锦

事务

6.1 概述

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

6.2 控制事务一

查看/设置事务提交方式

SELECT @@autocommit ;
SET @@autocommit = 0 ;

提交事务

COMMIT;

回滚事务

-- 当执行出现异常执行回滚事务
ROLLBACK;

6.3 控制事务二

开启事务

START TRANSACTION 或 BEGIN ;

提交事务

COMMIT;

回滚事务

ROLLBACK;
-- 关闭自动提交
SET autocommit = 0 ;
-- 开启事务
START TRANSACTION
UPDATE usermoney set money  = money -100 WHERE id = 1
UPDATE usermoney set money  = money +100 WHERE id = 2

-- ROLLBACK;
COMMIT;
SET autocommit = 1 ;

6.4 事务的四大特性ACID

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。(要么都执行,要么都不执行)
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。(永久写入硬盘,永久保存)

6.5 并发事务问题

1.赃读:一个事务读到另外一个事务还没有提交的数据。

比如B读取到了A未提交的数据,即A执行update后的数据被事务B读取到。

2.不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。

如图,当事务A执行查询id=1后,事务B更新id= 1的数据,然后事务A在执行执行查询id=1 数据,两次查询的数据不一样。

3.幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 “幻影”。

如图,第一步:执行查询时,没有找到对应的数据,第二步:事务B插入id = 1的数据,此时数据库中已经有id = 1的数据; 第三步:事务A再插入id = 1的数据,会插入失败,(id为主键)因为主键冲突或者重复了。第四步:事务A 再执行查询id=1的数据依旧查不到(因为已经解决重复读的问题)

小结:

6.6 事务隔离级别

隔离级别脏读不可重复读幻读
Read uncommitted
Read committed×
Repeatable Read(默认)××
Serializable×××
  • Read uncommitted 读未提交:

允许一个事务读取另一个事务未提交的数据,可能导致脏读,幻读,和不可重复读。

  • Read committed:读已提交

一个事务只能读取另一个事务已经提交的数据,避免了脏读,但仍可能出现幻读和不可重复读。

  • Repeatable Read(默认):可重复读

在一个事务中,多次读取相同的数据会保持一致性,避免了脏读和不可重复读。但仍可能出现幻读。

  • Serializable可串行化

最高的隔离级别,确保事务的串行执行,避免了脏读,不可重读和幻读。但性能较差。

事务隔离级别越高,数据越安全,但是性能越低。

查看事务隔离级别

SELECT @@TRANSACTION_ISOLATION;

设置事务隔离级别

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
显示全文