MYSQl-事务
一、什么是事务
简单点说,就是一堆sql逻辑排列在一起,要么全部执行,要么都不执行。只有InnoDB存储引擎才支持事务(SHOW ENGINES;)
二、如何开启一个事务
show VARIABLES LIKE '%autocommit%' 查看是否已经开启自动提交,如果为YES,那么每执行一条sql都会自动创建一个事务并提交
如果为NO,那么需要手动开启和提交事务
begin
sql....
commit or rollback
三、事务的性质(ACID)
- 原子性:一个事务是最小的不可分割单元,要么全部执行,要么都不执行(通过undolog实现)。
- 一致性:事物执行前后,数据的状态是一致的(redolog实现)。(例如A给B转账100元,执行后A要少100元,B要多100元)
- 隔离性:事务与事务之间,互相感知不到对方的存在,互不影响(通过锁+mvcc实现)。
- 持久性:事务一旦提交,将永久生效。后续操作将对其不产生影响(通过redolog实现,在commit之前先写redolog)。
四、事物隔离级别(并发的两个或多个事务)
- 读未提交 事务A能够读取到未提交事务B对数据做出的修改
- 读提交 事务A不能读取到未提交事务B对数据的修改,但如果事物B提交,事物A就能读到
- 可重复读 事务A不能读取到未提交事务B对数据的修改
- 串行化 事务A、B排队执行,完全互不影响
五、事务并发能产生的问题
- 脏读 事务A读取到了事物B未提交的数据,然后事物B回滚了,这个数据就是脏数据。
- 不可重复读 事务A重复执行相同条件的sql,查出来记录结果不一样。 读取到了事物B提交的数据
- 幻读 事务A重复执行相同条件的sql,查出来记录条数不一样。读取到了事物B提交的数据
六、四种隔离级别下存在的问题(1代表有可能)
脏读 | 不可重复读 | 幻读 | |
读未提交 | 1 | 1 | 1 |
读提交 | 0 | 1 | 1 |
可重复读 | 0 | 0 | 1 |
串行化 | 0 | 0 | 0 |