mysql事务

本文详细介绍了MySQL的事务控制,包括ACID四大特性:原子性、一致性、隔离性和持久性,并探讨了事务并发可能出现的异常,如脏读、不可重复读和幻读及其解决方案。此外,还讲解了锁、MVCC、redo log和undo log在事务管理中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

目的:事务将数据库从一种一致性状态转换为另一种一致性状态;
特征:在数据库提交事务,可以确保要么所有修改已经保存,要么所有修改都不保存;

一、事务控制语句

START TRANSACTION | BEGIN --显示开启事务
COMMIT--提交事务,并使得已对数据库做的所有修改持久化
ROLLBACK--回滚事务,结束用户的事务,并撤销正在进行的所有未提交的修改
SAVEPOINT identifier --创建保存点
RELEASE SAVEPOINT identifier --保存保存点
ROLLBACK TO [SAVEPOINT] indentifier --回滚至保存点

二、ACID特性

1.原子性(Atomicity)

要么都提交,要么都回滚。
实现:undolog 实现回滚操作

2.一致性(Consistency)

指数据库从一种一致性状态转变为下一种一致性状态,执行事务前后,数据库完整性没有被破坏。

3.隔离性(Isolation)

事务的隔离性要求每个读写事务的对象对其他事务的操作对象能互相分离,也就是事务提交前对其它事务都不可见。
实现:mvcc,表(索引B+树)锁,页(索引B+树叶子节点)锁,行(叶子节点当中某一段记录行)锁

4.持久性(Durability)

事务提交后,事务DML操作将会持久化(写入redolog磁盘文件);即使发送宕机等故障,数据库也能将数据恢复。redolog记录的是物理日志。

二、事务并发异常

1.脏读

现象:事务1可以读到事务2未提交的数据;
解决:隔离级别提升到read-committed。

2.不可重复读

现象:事务1可以读到事务2的提交数据。通常发生在一个事务种两次读到的数据是不一样的;
解决:隔离级别提升到repeatable-read

3.幻读

现象:事务中一次读操作不能支撑接下来的业务逻辑;通常发生在一个事务中一次读判断接下来写操作失败的情况。
解决:1.加读锁,select 语句后加 LOCK IN SHARE MODE;
2.隔离级别提升到serializable

4.小结

隔离级别脏读不可重复读幻读
READ-UNCOMMITTED存在存在存在
READ-COMMITTED不存在存在存在
REPEATABLE-READ不存在不存在存在
SERIALIZABLE不存在不存在不存在

三、其他细节

1.锁

锁类型概念
共享锁(S)行级读时使用
排他锁(X)行级更改或删除时使用
意向共享锁(IS)表级对表中几行使用的共享锁
意向排他锁(IX)表级对表中几行使用的排他锁

2.MVCC

概念:多版本并发控制;用来实现一致性的非锁定读(读时不加X锁)。

3.redo log

用来实现事务的持久性;内存中包含redo log buffer,磁盘中包含redo log file。

3.undo log

用来帮助事务回复,以及MVCC的功能;存储在共享表空间中;undo是逻辑日志,回滚时将数据库逻辑地恢复到原来的样子。同时记录行的版本信息,用于处理MVCC功能;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值