1 MySQL事务
1.1 MySQL事务操作
MySQL
事务控制语句:
- 开启事务:
START TRANSACTION
或者begin
- 提交事务:
COMMIT
- 回滚事务:
ROLLBACK
-
SET AUTOCOMMIT
=0
关闭自动提交 |1
开启自动提交
MySQL事务隔离级别
查看事务隔离级别:
SHOW VARIABLES LIKE 'tx_isolation';
修改隔离级别:
- 设置未提交读
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
- 提交读
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
- 可重复读
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
- 可串行化
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
附录:MySQL
默认事务隔离级别是REPEATABLE_READ(读已提交)
1.2 MySQL事务保证原子性
1.2.1 原子性介绍和保证
MySQL
作为一个关系型数据库,以最常见的 InnoDB
引擎来说,是如何保证 ACID
的:
- 原子性(
Atomicity
) : 事务是最小的执行单位,不允许分割。原子性确保动作要么全部完成,要么完全不起作用;
如何保证:
通过undo log
,undo log
记录了这些回滚需要的信息,当事务执行失败或调用了rollback
,导致事务需要回滚,便可以利用undo log
中的信息将数据回滚到修改之前的样子 - 一致性(
Consistency
): 执行事务前后,数据保持一致;
如何保证:
数据备份、主备、主主、主从都离不开Bin log
,需要依靠Bin log
来同步数据,保证数据一致性 - 隔离性(
Isolation
): 并发访问数据库时,一个事务不被其他事务所干扰
如何保证:
通过给操作的对象加悲观锁或者乐观锁,MVCC(undo log)
来保证,RC不满足隔离性,RR满足隔离性 - 持久性(
Durability
): 一个事务被提交之后。对数据库中数据的改变是持久的,即使数据库发生故障。
如何保证:
是通过redo
来保证的。
1.2.2 隔离性讲解
MVCC(Multi Version Concurrency Control)
即多版本并发控制,一个行记录
数据有多个版本对快照数据,这些快照数据在undo log
中。
如果一个事务读取的行正在做DELELE
或者UPDATE
操作,读取操作不会等行上的锁释放,而是读取该行的快照版本。