MySQL之什么是事务?什么是事务日志?

本文深入解析了数据库事务的概念,包括事务的ACID特性:原子性、一致性、隔离性和持久性,以及事务日志的作用和工作原理。事务日志通过追踪事务操作,确保数据的完整性和事务的高效执行。

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

什么是事务

事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态。

事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)的缩写,这四种状态的意思是:

1、原子性

即不可分割,事务要么全部被执行,要么全部不执行。如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生变化;如果有子事务失败,则其他子事务的数据库操作被回滚,即数据库回到事务执行前的状态,不会发生状态转换

2、一致性

事务的执行使得数据库从一种正确状态转换成另外一种正确状态

3、隔离性

在事务正确提交之前,不允许把事务对该数据的改变提供给任何其他事务,即在事务正确提交之前,它可能的结果不应该显示给其他事务

4、持久性

事务正确提交之后,其结果将永远保存在数据库之中,即使在事务提交之后有了其他故障,事务的处理结果也会得到保存

什么是事务日志

事务要保证ACID的完整性必须依靠事务日志做跟踪,每一个操作在真正写入数据数据库之前,先写入到日志文件中
如要删除一行数据会先在日志文件中将此行标记为删除,但是数据库中的数据文件并没有发生变化.
只有在(包含多个sql语句)整个事务提交后,再把整个事务中的sql语句批量同步到磁盘上的数据库文件.
在事务引擎上的每一次写操作都需要执行两遍:
1.先写入日志文件中
写入日志文件中的仅仅是操作过程,而不是操作数据本身,所以速度比写数据库文件速度要快很多.
2.然后再写入数据库文件中
写入数据库文件的操作是重做事务日志中已提交的事务操作的记录.
日志组
一般不止设置一个日志文件,一个文件写满之后使用另外一个日志文件提高服务器效率.
日志文件的日志同步到磁盘后空间会自动释放,单个日志文件不宜设置过大 如果日志文件过大mysql进程在把日志同步到数据文件的时候可能会崩溃

事务日志用途

事务日志可以帮助提高事务的效率,使用事务日志,存储引擎在修改表的数据的时候只需要修改其内存拷贝,再把该行为记录到持久在磁盘的事务日志中.而不用每次都将修改的数据本身持久到磁盘.事务日志采用的是追加方式,因此写日志的操作是磁盘上一小块区域的顺序IO,而不像随机IO需要磁盘在多个地方移动.所以采用事务日志的方式相对来说要快的多,事务日志持久后,内存中的修改在后台慢慢的刷回磁盘.期间如果系统发生崩溃,存储引擎在重启的时候依靠事务日志自动恢复这部分被修改数据
–整理自《高性能MySQL》

<think>我们已经在之前讨论了MySQL事务的基本概念和ACID特性。现在用户进一步询问事务的定义和功能,需要结合引用内容进行详细解释。首先,我们需要明确事务的定义:事务是数据库操作的一个执行单元,包含一组SQL语句(如INSERT/UPDATE/DELETE等),这些操作要么全部成功,要么全部失败。其次,根据引用[1],事务具有ACID特性(原子性、一致性、隔离性、持久性)。引用[3]也提到事务是为程序员服务的,有四个性质:隔离性、持久性、原子性、一致性。功能方面,事务主要解决两个问题:一是确保在并发环境下数据的一致性和完整性(引用[1]);二是提供一种机制,使得一系列操作可以作为一个整体执行(引用[3]中提到的begin和commit)。此外,引用[2]提到,当我们执行一些修改数据库对象的语句(如CREATE、ALTER、DROP)时,会隐式提交事务,这一点需要注意。关于隔离级别,引用[4]详细介绍了四个隔离级别及其解决的问题(脏读、不可重复读、幻读)。因此,回答结构可以设计为:1.事务的定义(结合引用[1])2.事务的ACID特性(分别解释,结合引用[1]和[3])3.事务的基本操作(BEGIN,COMMIT,ROLLBACK,结合引用[3])4.事务的隔离级别(结合引用[4]简要说明各级别解决的问题)5.注意事项(如隐式提交,引用[2])最后,生成相关问题。注意:回答中引用标记要自然放在引用内容末尾。</think> ### MySQL事务的定义及功能详解 #### 一、事务定义 MySQL事务是一组**原子性操作单元**,包含多条SQL语句(如INSERT/UPDATE/DELETE),这些语句构成一个**不可分割的工作单元**。具体表现为: 1. **执行边界**:通过`BEGIN`或`START TRANSACTION`显式开启,以`COMMIT`提交或`ROLLBACK`回滚结束[^3] 2. **最小单元**:即使单条SQL语句也会构成隐式事务(受autocommit参数控制)[^3] > 示例: ```sql START TRANSACTION; -- 事务开始 UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; UPDATE accounts SET balance = balance + 100 WHERE user_id = 2; COMMIT; -- 事务提交 ``` #### 二、核心功能:ACID特性 | 特性 | 作用机制 | 功能说明 | |------|----------|----------| | **原子性**<br>(Atomicity) | Undo日志实现 | 事务内操作要么全部成功,要么全部撤销(如转账失败时全额回退)[^1] | | **一致性**<br>(Consistency) | 约束检查 | 事务前后数据满足完整性约束(如账户总额不变)[^1] | | **隔离性**<br>(Isolation) | 锁/MVCC机制 | 并发事务互不干扰,由隔离级别控制可见性[^4] | | **持久性**<br>(Durability) | Redo日志保证 | 已提交事务永久保存,即使系统故障[^1] | #### 三、关键能力解析 1. **并发控制** - 通过隔离级别解决并发问题: ```mermaid graph LR READ_UNCOMMITTED-->脏读[可能发生脏读] READ_COMMITTED-->解决脏读-->不可重复读[可能不可重复读] REPEATABLE_READ(Mysql默认)-->解决不可重复读-->幻读[可能幻读] SERIALIZABLE-->完全串行化 ``` [^4] 2. **异常恢复** - 自动回滚:执行过程出错时自动撤销操作 - 手动回滚点: ```sql SAVEPOINT sp1; -- 设置回滚点 -- 执行部分操作 ROLLBACK TO sp1; -- 回退到特定点 ``` 3. **大事务优化** - 拆分策略:将大批量操作分批次执行 - 锁超时设置:避免长事务阻塞 #### 四、注意事项 1. **隐式提交**:执行`CREATE TABLE`等DDL语句会强制提交当前事务[^2] 2. **隔离级别选择**: $$权衡公式:\text{隔离强度} \propto \frac{1}{\text{并发性能}}$$ 3. **死锁预防**:保持事务简短,按固定顺序访问资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值