MySQL:事务

一、概念

MySQL 事务是一组数据库操作的集合,这些操作要么全部成功执行,要么全部不执行,以保证数据的一致性和完整性。


二、ACID

事务具有以下四个重要特性,通常称为 ACID 特性:

2.1 原子性(Atomicity)

原子性指的是事务中的所有操作要么全部成功执行,要么全部不执行,就如同一个不可分割的原子。

例如,假设我们有一个包含两个操作的事务:从账户 A 转出 100 元,并将这 100 元存入账户 B。
如果在执行过程中,从账户 A 成功转出了 100 元,但在存入账户 B 时由于某种原因(如网络故障、数据库错误等)失败了,那么整个事务必须回滚,就好像这两个操作都没有发生过一样,即账户 A 的钱不会减少,账户 B 的钱也不会增加。


2.2 一致性(Consistency)

一致性指的是事务执行的结果必须使数据库从一个一致性状态转换到另一个一致性状态,强调的是数据的完整性和准确性,无论事务执行成功还是失败,数据库中的数据都必须保持一致。

例如,假设有一个银行系统,存在账户余额不能为负数的约束。如果一个事务包含从账户中取款的操作,而取款后导致余额变为负数,那么这个事务就违反了一致性原则,应该被回滚或采取相应的纠错措施,以确保账户余额始终符合约束条件。


2.3 隔离性(Isolation)

隔离性是指多个事务并发执行时,它们之间相互隔离,互不干扰。每个事务都感觉不到其他事务在并发地执行,就好像在独立地操作数据库,主要目的是防止并发事务之间的相互影响,避免出现数据不一致、脏读、不可重复读和幻读等问题。

以下是几种常见的隔离级别:

  • 读未提交(Read Uncommitted):一个事务可以读取另一个未提交事务的数据。这可能导致脏读问题,即读取到了未提交的数据,如果回滚,这些数据可能是无效的。
    例如,事务 A 修改了一条数据但未提交,事务 B 此时读取到了该数据,然后事务 A 回滚,那么事务 B 读取到的就是脏数据。
  • 读已提交(Read Committed):一个事务只能读取已经提交的数据,避免了脏读,但可能导致不可重复读问题。不可重复读是指在同一个事务中,多次读取同一数据得到的结果不同。
    例如,事务 A 读取了某条数据,事务 B 对其进行了修改并提交,然后事务 A 再次读取该数据时结果不同。
  • 可重复读(Repeatable Read):这是 MySQL 的默认隔离级别。在一个事务中多次读取相同的数据,结果是一致的,避免了不可重复读,但可能出现幻读问题。幻读是指当一个事务基于某个条件读取数据时,另一个事务插入了满足该条件的新数据,导致第一个事务再次执行相同查询时,结果集发生了变化。
    例如,事务 A 基于某个条件查询得到结果集,事务 B 插入了满足条件的新数据并提交,事务 A 再次执行相同查询时结果集多了新数据。
  • 串行化(Serializable):这是最高的隔离级别,通过强制事务串行执行,避免了上述所有问题,但可能会影响并发性能。

隔离级别的选择取决于具体的应用场景和对数据一致性、并发性能的要求。在实际应用中,需要根据业务需求权衡隔离性和性能之间的关系。

2.4 持久性(Durability)

持久性指的是一旦事务被成功提交,它对数据库所做的更改就会被永久保存,即使系统出现故障(如断电、服务器崩溃等),数据也不会丢失。
例如,在一个在线教育平台的数据库中,学生成功报名了一门课程,这个报名操作被包含在一个事务中并且成功提交。即使之后数据库服务器突然发生故障,当系统恢复时,学生报名课程的记录仍然存在,不会因为故障而丢失。


三、操作事务

MySQL 默认事务是自动提交的,也就是说当执行一条 增、删、改 操作时,MySQL 都会立即隐式的提交事务。

所以我们就需要将一系列操作都控制在一个事务中,让这些操作要么同时成功,要么同时失败,这样就可以保证数据的一致性和完整性。

可以通过以下语句来开启、提交和回滚事务:

-- 开启事务
START TRANSACTION;

-- 执行一系列操作
......

-- 操作全部执行成功,则提交事务
COMMIT;

-- 如果有一个操作失败,则回滚事务
ROLLBACK;

事务在许多场景中非常有用,比如银行转账、订单处理、库存管理等,确保数据的准确性和可靠性。

例如,在电商网站的订单处理中,如果同时涉及到库存更新、用户账户扣款和订单记录创建等操作,就需要将这些操作放在一个事务中,以防止部分操作成功而部分操作失败导致的数据不一致问题。


  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野生派蒙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值