事务的概念
- 事务是一个操作序列,该序列中的多个操作要么都做,要么都不做
事务的操作
- 开启事务(标识事务开始):
START TRANSACTION;
- 提交事务(将执行结果写入到数据库):
COMMIT;
- 回滚事务(所有影响到的数据,将返回到事务开始以前的状态):
ROLLBACK;
- 提示:MYSQL默认自动提交事务,手动操作需要先开启事务
事务的四大特征(ACID)
- 原子性(Atomicity):事务是最小的单位,不可再分
- 一致性(Consistency):事务要求所有的DML语句操作时,必须保证同时成功或者同时失败
- 隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰
- 持久性(Durability):事务一旦提交,它对数据库的改变就应该是永久性的
事务的隔离级
- READ UNCOMMITTED:读未提交
- READ COMMITTED:读已提交
- REPEATABLE READ:可重复读
- SERIALIZABLE:串行化
提示:MySQL默认的事务隔离级别是:REPEATABLE READ
事务隔离级别与并发问题
隔离级别/并发问题 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | ✔ | ✔ | ✔ |
读已提交 | ✘ | ✔ | ✔ |
可重复读 | ✘ | ✘ | ✔ |
串行化 | ✘ | ✘ | ✘ |
- ✔:表示可能出现的并发问题
- ✘:表示不可能出现的并发问题
- 脏读:指一个线程中的事务读取到了另外一个线程中未提交的数据
- 不可重复读:指一个线程中的事务读取到了另外一个线程中提交的update的数据
- 幻读:指一个线程中的事务读取到了另一个线程中提交的insert的数据
设置事务隔离级别
说明:隔离级别越高,越能保证数据的完整性、一致性,但对并发性的影响也越大
- 读未提交:
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
- 读已提交:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
- 可重复读:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
- 串行化:
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE
查看事务的隔离级别
- 语法:
SELECT @@TRANSACTION_ISOLATION;