一、认识事务
1、多线程访问数据库出现的问题
MySQL 是一款网络服务,必定存在多个客户端同时访问服务器的场景。假如有一个抢票系统,有两个客户端抢票,一个客户端抢票之后,数据库还没有及时更新,这张票又被另一个客户端抢了一次,一张票被卖了两次。这不符合逻辑! 于是,必须要对数据库的 CURD 操作进行一定的限制,才能解决上面的问题。
2、对 CURD 的限制是通过事务机制实现的
事务就是一组 DML 语句组成,这些语句在逻辑上存在相关性,这一组 DML 语句要么全部成功,要么全部失败,是一个整体。 事务主要用于处理操作量大,复杂度高的数据。比如要删除一个被开除的员工的所有历史信息以及和他相关的信息,就需要多条 MySQL 语句构成,那么所有这些操作合起来,就构成了一个事务。
但是要知道,同一时刻并不是只有一个事务在运行,而是有多个事务同时在运行。如果大量的事务在不加保护的情况下访问同一个表数据,就一定会出现问题。因为事务由多条 sql 语句组成,一个事务执行了一半,突然 mysql 客户端挂了,那么这执行了一半的事务该怎么处理?
3、事务的四个属性
于是,MySQL 规定,一个完整的事务,不仅仅是简单的 sql 语句的组合,还要满足下面的 四个属性:
原子性(Atomicity,或称不可分割性): 一个事务(transaction)中的所有操作,要么 全部完成,要么 全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误(导致客户端挂了),执行了一半的事务会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性(Consistency): 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
隔离性(Isolation,又称独立性): 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read Uncommitted)、读提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
持久性(Durability): 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
此外,事务本质上是为应用层服务的。因为我们并不是直接访问数据库的,而是通过上层的各种语言来间接访问数据库的,于是多条 sql 语句封装出来的事务可以简化上层的编程模型和逻辑。
4、哪些引擎支持事务
使用指令查询:
mysql> SHOW ENGINES\G;
*************************
Engine: ndbcluster
Support:
...
Engine: InnoDB
Support:
Comment: Supports transactions, level locking, keys
Transactions: YES XA: YES Savepoints: YES
...
( sec)


