文章目录
(一) mysql笔记–基本概念
(二) mysql笔记–基本操作
(三) mysql笔记–事务
(四) mysql笔记–索引
(五) mysql笔记–其他操作
(六) mysql笔记–锁
3. 事务
事务保证了一些操作同时成功或者同时失败,例如转账,即提供撤销机会
mysql默认开启事务(自动提交), select @@autocommit;查看;写完sql语句后需要执行commit;提交后无法撤销,若事务未结束更改表属性或其他操作会隐式提交
开启自动提交后执行sql语句立即生效,不能回滚(rollback即撤销)
3.1 事务的特性
- A 原子性(Atomicity): 事务时最小单位,不可以分割
- C 一致性(Consistency): 同一事务中必须保证同时成功或失败
- I 隔离性(Isolation): 事务之间相互隔离
- D 持久性(Durability): 事务一旦结束,不可返回
3.2 事务的操作
- 事务开启
修改默认提交 set autocommit = 0
使用 begin;
使用 start transaction;
- 事务提交 commit
- 事务撤销 rollback
直接回滚回到最初状态
设置回滚点: savepoint 名称
回滚到某个点: rollback to 回滚点名称
3.3 事务的隔离性
3.3.1 隔离等级
- 查看数据库隔离等级:
会话级: select @@transaction_isolation 或者 select @@tx_isolation
系统级: select @@global.transaction_isolation
- read uncommitted; 读取未提交的
- read commited; 读取已提交的
- repeatable read; 可以重复度,默认级别
- serializable; 串行化
- 更改系统隔离级别
等级1 set global transation isolation level read uncommitted;
等级2 set global transation isolation level read committed;
等级3 set global transation isolation level repeatable read;
等级4 set global transation isolation level serializable;
等级越高效率越低
3.3.2 读取问题
- 脏读现象:在read uncommitted级别1,不同终端读取到未提交的数据,其他终端可撤回,造成欺骗,这不允许的
- 不可重复读现象:在read commited级别2,事务过程中其他终端操作了同一张表,造成前后数据不一致
- 幻读:在repeatable read级别3,事务中其他的终端插入了新的数据,但不可读取到,当插入相同的主键时产生错误
- 串行化serializable,解决了以上问题,即给表上锁,不同终端排队操作,没有超时的情况下则排队,但不能并发读写,性能极低