事务的基础知识:
在MySQL中只有InnoDB存储引擎支持事务
1.数据库事务的概述:
事务是数据库区别于文件系统的重要特征之一,当我们有了事务就会让数据库始终保持一致性,同时我们还可以通过事务的机制恢复到某个时间点
基本概念:
事务:是一组逻辑单元,使数据从一种状态转换到另一种状态
事务处理原则:保证所有事务作为一个工作单元来执行,即使出现了故障都不能改变这种执行方式,一个事务中执行多个操作,要么都被提交,要么全部放弃,回滚到最初的状态
如:转账操作就是一个事务,不能让钱的总额改变
事务的ACID特征:
1.原子性
原子性指事务是一个不可分割的工作单位,要么全部提交,要么全部失败回滚
2.一致性
一致性是指事务在执行前后,数据从一个合法性状态,变换到另一个合法性的状态(满足实际规定)
例如:A有100元,去取钱不能多余100元(因为规定钱不能为负数)
A给B转账,要保证A和B的余额总数转账前后相同
3.隔离性
指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的过程中各个事务之间不能互相干扰
4.持久性
一旦事务进行了提交,则对数据的改变是永久性的,不会被接下来的其他操作影响
持久性是通过事务日志来保证的,日志包括了重做日志和回滚日志,当我们通过事务对数据进行修改的时候,首先会将数据库的变化信息记录到重做日志中,然后再对数据库中对应的行进行修改,这样的好处是,即使数据库宕机,数据库重启后也能找到没有更新到数据库中的重做日志,重新执行,从而使事务具有持久性
总结:
ACID是事务的四大特征,原子性是基础,隔离性是手段,一致性是约束条件,而持久性是我们的目的
数据库事务其实就是数据库操作者为了方便,把需要保证原子性,隔离性,一致性,持久性的一个或多个数据库操作成为一个事务
事务的状态
活动的:事务对应的数据库操作正在执行中
部分提交:事务操作执行完成,还未刷盘将数据保存到磁盘
失败的:事务处于活动或部分提交状态时,遇到了一些错误导致事务停止执行
中止的:当事务一部分变为失败的状态,回滚到之前的状态,回滚完毕后成为事务中止的
提交的:一个处于部分提交的状态通过修改过的数据同步到磁盘上
如何使用事务?
事务的完整过程:
1.开启事务
2.一系列的DML操作
3.事务的状态:(事务结束)
提交:COMMIT
中止:ROLLBACK
1.显式事务
使用关键字开启事务(两种方式)
start transaction (使用该方式可以设置是否只读?可以读写(默认read write)?一致性读?)
begin
保存点(savepoint)可以控制回滚到保存点而不是回滚到最初状态
2.隐式事务
关键字:autocommit(自动提交)
默认开启自动提交的状态下,我们的每一个DML操作都是一个隐式事务,会自动提交
如果我们显式的开启了事务,那么DML操作就不会自动提交数据
隐式提交数据的情况:
1.数据定义语言(DDL)CREATE、ALTER、DROP等操作
2.使用或修改MySQL数据库中的表,如:ALTER USER、CREATE USER等
3.事务控制或关于锁定的语句
当一个事务还没进行提交或回滚操作时,又显式的开启了一个事务,那么会隐式提交上一个事务
当前的autocommit系统变量的值为OFF,手动变为ON会隐式提交前面语句的事务
使用LOCK TABLES等关于锁定语句也会隐式提交前面语句所属的事务
4.加载数据的语句
使用LOAD DATA语句来批量向数据库中导入数据时,也会隐式的提交前面语句所属的事务
5.关于MySQL复制的一些语句
使用START SLAVE、STOP SLAVE、RESET SLAVE等语句也会隐式的提交前面语句所属的事务
6.一些其他语句
使用ANALYZE TABLE(分析表) 检查表,优化表等操作也会隐式的提交前面语句所属的事务
数据并发问题:
1.脏写
对于两个事务A,B,如果事务A修改了另一个事务B修改过的数据,那就说明发生了脏写
2.脏读
事务A读取了已经被事务B更新但还未提交的数据,如果事务B进行回滚,那么A读取的内容就是临时且无效的
3.不可重复读
事务A读取了一个字段,然后事务B更新了该字段,之后事务A再次进行读取,发现数据改变了
4.幻读
事务A从一个表中读取了一个字段,然后事务B在该表中插入了一些新的行,之后事务A再次读取同一个表,就会多出几行
事务的隔离级别:(隔离级别越高,并发性越差)
1.读未提交:解决脏写
2.读已提交:解决脏读、脏写
3.可重复读:解决脏写,脏读,不可重复读 (MySQL默认)
4.可串行化:均解决