事务控制语言TCL

参考:链接1

什么是事务

事务是指程序中一系列严密的逻辑操作,而且所有操作必须全部成功完成,否则在每个操作中所做的所有更改都会撤销。可看作是对数据库操作的基本执行单元,可能包含一个或多个SQL语句(这些语句要么都执行,要么都不执行)。

事务的四个特性(ACID)

  • 原子性(Atomicity):语句要么全执行,要么全不执行。只要出现一个指令执行失败,其他指令都执行失败,数据进行回滚,回到执行志龙前的数据状态。
    • 事物的原子性是通过undo log日志进行实现的。当事务需要进行回滚时,InnoDB引擎就会调用undo log日志进行SQL语句的撤销,实现数据的回滚。
  • 一致性(Consistency):事务的执行使数据从一个状态转换为另一个状态,但对于整个数据的完整性保持稳定。
  • 隔离性(Isolation):保证事务执行尽可能不受其他事务影响;InnoDB 默认的隔离级别是 RR。
  • 持久性(Durability):当事务正确完成后,数据的改变是永久性的。
    • 事务的持久性是通过InnoDB存储引擎中的redo log日志来实现的。

并发读写问题

  • 脏读:当前事务中读到其他事务未提交的数据
  • 不可重复读:在事务中先后两次读取同一数据,但两次读取的结果不一样 ,脏读和不可重复读的区别在于:前者读到的是其他事务未提交的数据,后者读到的是其他事务已经提交的数据。
  • 幻读:在事务中按照某个条件先后两次查询数据库,两次查询结果的行数不同,这种现象称为幻读。不可重复读与幻读的区别可以理解为:前者数据变了,后者数据的行数变了。

隔离级别

事务的隔离级别有4种,由低到高分别为Read uncommittedRead committedRepeatable readSerializable 。而且,在事务的并发操作中可能会出现脏读不可重复读幻读

  • Read Uncommitted:一个事务可以读取另一个未提交事务的数据。
  • Read Committed:一个事务要等另一个事务提交后才能读取数据。
  • Repeatable Read:开始读取数据时,不再允许修改操作。
  • Serializable:是最高的事务隔离级别,在该 级别下,事务串行化顺序执行。可避免脏读,不可重复读与幻读。但这种级别效率低下。
隔离级别 脏读 不可重复读 幻读
Read Uncommitted 可能发生 可能发生 可能发生
Read Committed 不可能发生 可能发生 可能发生
Repeatable Read 不可能发生 不可能发生 可能发生
Serializable 不可能发生 不可能发生 不可能发生