事务
1. 事务的基本概念
数据库事务是构成单一逻辑工作单元的操作集合
事务是一组操作的结合,是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销请求,即这些操作要么同时成功,要么同时失败
begin ; start transaction; -- 开启事务
update account set money = money + 100 where name = '张三';
commit; -- 提交
rollback; -- 回滚
- 数据库事务可以包含一个或多个数据库操作,但是这些操作构成一个逻辑上的整体。
- 构成逻辑整体的这些数据库操作,要么全部执行,要么全部不执行。
- 构成事务的所有操作,要么全都对数据库产生影响,要么全都不产生影响。
- 在数据库出现故障时依然成立。
2. 事务的四大特性
- A : 原子性
事务是不可分割的最小操作单元,要么全部执行成功,要么全部失败。
- C :一致性
事务完成时,必须使所有的数据都保持一致状态,即数据库从一个一致状态到另一个一致状态。
- 一致性状态满足数据的完整性约束,系统的状态反应数据库本应描述的现实世界的真实状态,比如转账前后两个账户的总金额不变。
- I :隔离性
数据库系统需要提供隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。假如同时有多个事务并发执行,执行的结果应当同顺序执行一样。
- D : 持久性
事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
3. MySQL四大特性如何保证
- 原子性:如果事务中所有的操作均成功,那么会将表信息更改;如果事务中至少有一条操作不成功,在没有提交事务之前,mysql会先将数据更新到
undo log
中,假设最终因为某条操作不成功而发生了事务的回滚,会从undo log
中取出数据对数据库中的数据进行回退。
undo log
日志:撤销回退日志,主要用来存储数据库更新之前的数据,用作备份
一致性: 事务的一致性可能遭到的破坏主要有两方面
- 事务的并发执行
- 事务故障或系统故障
解决方法是使用并发控制技术和日志恢复技术。
隔离性:并发控制技术(乐观锁,悲观锁)
每一行记录数据都有多个版本的快照数据,这些数据都存放在undo log中当一个事务读取正在更新或删除的数据时,会读取到该数据的快照版本。
- 持久性:由于日志恢复技术可以在数据库发生崩溃时数据不会丢失,保证了事务的完整性
innodb中的redo log可以保证持久性,MySQL先将磁盘上的数据加载到内存中,在内存中对数据进行修改,再写回磁盘上,如果此时宕机,内存中的数据就会丢失
使用redo log来解决此问题,在对数据库中的数据进行修改时,不仅会在内存中操作,还会记录在redo log中,当数据库内存中的数据丢失时,会将redo log中的内容恢复到数据库中。