事务控制语言TCL
参考:链接1
什么是事务
事务是指程序中一系列严密的逻辑操作,而且所有操作必须全部成功完成,否则在每个操作中所做的所有更改都会撤销。可看作是对数据库操作的基本执行单元,可能包含一个或多个SQL语句(这些语句要么都执行,要么都不执行)。
事务的四个特性(ACID)
- 原子性(Atomicity):语句要么全执行,要么全不执行。只要出现一个指令执行失败,其他指令都执行失败,数据进行回滚,回到执行志龙前的数据状态。
- 事物的原子性是通过undo log日志进行实现的。当事务需要进行回滚时,InnoDB引擎就会调用undo log日志进行SQL语句的撤销,实现数据的回滚。
- 一致性(Consistency):事务的执行使数据从一个状态转换为另一个状态,但对于整个数据的完整性保持稳定。
- 隔离性(Isolation):保证事务执行尽可能不受其他事务影响;InnoDB 默认的隔离级别是 RR。
- 持久性(Durability):当事务正确完成后,数据的改变是永久性的。
- 事务的持久性是通过InnoDB存储引擎中的redo log日志来实现的。
并发读写问题
- 脏读:当前事务中读到其他事务未提交的数据
- 不可重复读:在事务中先后两次读取同一数据,但两次读取的结果不一样 ,脏读和不可重复读的区别在于:前者读到的是其他事务未提交的数据,后者读到的是其他事务已经提交的数据。
- 幻读:在事务中按照某个条件先后两次查询数据库,两次查询结果的行数不同,这种现象称为幻读。不可重复读与幻读的区别可以理解为:前者数据变了,后者数据的行数变了。
隔离级别
事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。
- Read Uncommitted:一个事务可以读取另一个未提交事务的数据。
- Read Committed:一个事务要等另一个事务提交后才能读取数据。
- Repeatable Read:开始读取数据时,不再允许修改操作。
- Serializable:是最高的事务隔离级别,在该 级别下,事务串行化顺序执行。可避免脏读,不可重复读与幻读。但这种级别效率低下。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read Uncommitted | 可能发生 | 可能发生 | 可能发生 |
Read Committed | 不可能发生 | 可能发生 | 可能发生 |
Repeatable Read | 不可能发生 | 不可能发生 | 可能发生 |
Serializable | 不可能发生 | 不可能发生 | 不可能发生 |