mysql事务
- 事务:
- 什么是事务
- 事务是访问和更新数据库的程序执行单元,一个事务中可能包含一个或多个sql语句,且这些语句要么都执行,要么都不执行
- mysql逻辑架构
如上图,mysql服务器逻辑架构分为三层- 处理客户端连接,授权认证
- 服务器层,负责查询语句的解析、优化、缓存以及内置函数的实现存储过程
- 存储引擎,负责mysql中数据的存储和提取,服务器层不管理事务,事务主要是存储引擎来实现的,mysql中支持事务的存储引擎有Innodb,不支持事务有myisam,memory
- 提交和回滚
- mysql中默认是采取自动提交的模式
- 特性ACID
- Atomicity(原子性)
- 原子性:指事务整个过程如原子操作一样,其中的操作要么全部都执行,要么都不执行,如果事务中一个操作失败则全部回滚,退回事务前状态
- Consistency(一致性)
- 一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态
- Isolation(隔离性)
- 隔离性:一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰的
- Durability(持久性)
- 持久性:一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的,当事务提交后数据的会持久化到硬盘,修改是永久性的
- 注意点
- 按照严格的标准,只有同时满足ACID特性才是事务,Innodb默认事务隔离级别是可重复读不满足隔离性
- Atomicity(原子性)
- Mysql的隔离级别
- Read Uncommitted(读未提交)
- 所有的事务都可以看到其他未提交事务的执行结果
- 问题:脏读(读取未提交的数据)
- Read Committed(读取提交内容)
- 这是大多数数据库系统的默认隔离级别
- 一个事务只能看到已经提交事务所做的改变
- 问题:不可重复读
- 不可重复读意味着同一事务中执行完全相同的select语句可能所看到不一样的结果
- Repeatable Read(可重复读)
- 这是Mysql默认事务隔离级别
- 确保同一事务的多个实例在并发读取数据,会看到同样的数据行
- 问题:幻读(当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行会发现有新的“幻影”行)
- InnoDB 和 Falcon 存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
- Serializable(串行化)
- 最高的隔离级别
- 通过强制事务排序,使之不可能相互冲突,从而解决幻读问题(它是在每个读的数据行上加上共享锁。)
- 可能会导致大量的超时和锁竞争
- Read Uncommitted(读未提交)
- 链接:
- 什么是事务