数据库 事务

数据库 事务(Transaction)

数据库事务的定义和使用,隔离级别以及通过隔离能够解决的问题

定义

事务是一个操作集合,这些操作要么全都执行,要么全部不执行。
要么所有操作都成功,要么就都不成功,如果执行中有某一项操作失败,其之前所有的操作都回滚到未执行这一系列操作之前的状态。

特性(ACID)

  • 原子性(Atomicity):一个事务中的所有操作,要么执行要么都不执行,中途不会结束。如果发生错误,会被回滚到执行之前的状态。
  • 一致性(Consistency):事务完成之后,数据库的完整性没有破坏,符合数据库预定的规则。从一个一致性状态变为另一个一致性状态。
  • 隔离性(Isolation):事务之间是互相隔离,互不干涉的。该事务以外的实体不知道事务的中间流程细节。在多个事务并发执行时,可以防止交叉执行导致的数据不一致的问题。
  • 持久性(Durable):事务处理结束后,对数据的修改就是永久的。

事务控制语句

  • BEGIN 或 START TRANSACTION 显式开启事务
  • COMMIT 或 COMMIT WORK 提交事务
  • ROLLBACK 或 ROLLBACK WORK 回滚事务
  • SAVEPOINT identifier 保存一个叫identifier 的保存点
  • RELEASE SAVEPOINT identifier 删除这一保存点
  • ROLLBACK TO identifier 回滚到保存点
  • SET TRANSACTION 设置隔离级别

可解决的问题

1.脏读的问题

比如有两个事务A,事务B
A事务读取B事务还未提交的事务,此时如果B事务发生错误,并回滚了事务,这是A事务读到的数据就是脏数据。称之为脏读
eg:取款事务,转账事务
输入图片说明

2.不可重复读的问题(前后多次读取,数据内容不一致)

eg:事务A要运行很长时间,第一次查询小明年龄20岁,之后他就执行其他操作,此时事务B也在执行,事务B把小明年龄改为30岁,事务A第二次查询小明年龄就变成了30。
输入图片说明

3.幻读的问题(前后多次读取,数据总量不一致)

eg:与不可重复读类似。前后的数量不一致。
二者区别在于:
不可重复读 update 造成的数据不一致
幻读 insert , delete 造成的数量不一致
输入图片说明

隔离分不同的等级:

  • 读未提交 READ UNCOMMITTED

一个事务可以读取到另一个事务还未提交的数据,这会产生脏读。另外不可重复读,幻读也会发生。

  • 读提交 READ COMMITTED
    与读未提交相反,该隔离级别只能读取到其他事务已经提交的数据,那些没有提交的数据是读不出来的。解决了脏读的问题,但是产生不可重复读和幻读的问题。

  • 可重复读 REPEATABLE READ
    该隔离级别可以让事务在自己的会话中重复读取数据 并且不会出现结果不一样的状况
    即使其他事务已经提交了,也依然还是显示以前的数据。解决了脏读,不可重复读问题,insert,delete还是不行,解决不了幻读的问题。

  • 串行化 SERIALIZABLE

    解决所有问题的隔离级别。但为之带来的就是性能的衰落。只能顺序执行。

输入图片说明

参考

一文搞懂什么是事务 - 知乎 (zhihu.com)

MySQL中事务的隔离级别(读未提交、读已提交、重复读、可串行化)_读未提交和串行化又是如何解决-CSDN博客


数据库 事务
http://zanderchan666.github.io/2023/10/25/事务/
作者
Zander
发布于
2023年10月25日
许可协议