1 事务
1.1 事务的特性
- 原子性:是指事务包含所有操作要么全部成功,要么全部失败回滚。
- 一致性:指事务必须使数据库从一个一致性状态变换成另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。拿转账来说,假设用户 A 和用户 B 两者的钱加起来一共是 5000,那么不管 A 和 B 之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是 5000,这就是事务的一致性。
- 隔离性:是当多个用户并发访问数据库时,比如操作同一张表时,数据表为每个用户开启的事务,不能被其他事务所干扰,多个并发事务之间要相互隔离。
- 持久性:持久性是指一个事务一旦被提交,那么对数据库中的数据的改变就是永久的,即便是在数据库系统遇到故障的性况下也不会丢失提交事务的操作。
1.2 并发操作问题
- 脏读:脏读是指在一个事务处理过程中读取到了另外一个未提交事务中的数据。
- 不可重复读:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
- 虚读(幻读):幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。比如两个事务操作,A 事务查询状态为 1 的记录时,这时 B 事务插入了一条状态为 1 的记录,A 事务再次查询返回的结果不一样。
1.3 事务的隔离级别
- Serializable(串行化):可避免脏读、不可重复读、幻读。(就是串行化读数据)
- Repeatable read(可重复读):可避免脏读、不可重复读的发生。
- Read committed(读已提交):可避免脏读的发生。
- Read uncommitted(读未提交):最低级别,任何情况都无法保证。
在 MySQL 数据库中,支持上面四种隔离级别,默认的为 Repeatable read (可重复读);而在 Oracle 数据库中,只支持 Serializable (串行化)级别和 Read committed (读已提交)这两种级别,其中默认的为 Read committed 级别。