一、事务简介
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
例如,银行转账就是一个事务
如果事务出现异常,比如张三转1000元给李四,但李四没有收到这笔钱,那么就需要回滚事务。回滚事务就是将张三和李四的数据恢复。
- 注意:
- 默认MySQL的事务是自动提交的
- 要想把若干个操作放到事务内,我们需要手动开启、提交、回滚事务
二、事务操作
方式一:
- 查看/设置事务提交方式(值为1是自动提交,值为0是手动提交)
SELECT @@autocommit;
SET @@autocommit=0;
- 提交事务
COMMIT;
- 回滚事务
ROLLBACK;
示例:
方式二
- 开启事务
START TRANSACTION 或BEGIN;
- 提交事务
COMMIT;
- 回滚事务
ROLLBACK;
示例:
注意:程序执行报错时,不要提交事务,而是回滚事务
开启事务一定要以commit或者是rollback结尾,不然没办法开启新的事务
三、事务四大特性ACID(面试考题)
原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败
一致性(Consistency):事务完成时,必须使所有数据都保持一致状态 可以简单理解为能量守恒
隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行 事务之间不会相互影响
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据改变就是永久的 数据存储在磁盘中
四、并发事务问题
是指在多个事务之间产生的脏读、不可重复读、幻读的问题
脏读
不可重复读
幻读
五、事务隔离级别(面试必问、初级必背)
1. 分类
图中打勾的是隔离级别不能完成的问题
注:serializable是隔离级别最高,数据最安全,性能最低的,read uncommitted反之。
2. 语法
查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别(SESSION代表仅设置当前会话,GLOBAL代表设置全部会话)
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED|READ COMMITTED|REPEATBLE READ|SERIALIZABLE}
解决脏读,就是在B事务未提交时,A事务不能查询到B事务更改的数据
解决不可重复读,就是在B事务提交之后,A事务提交之前查询到的数据一致,而在A事务提交之后才能查询到新的结果
解决幻读,就是事务之间排队,只有A事务执行完毕后,B事务才能执行