事务及其四大特性:
事务(Transaction):
访问并可能更新数据库中各种数据项的一个程序执行单元(unit),
它通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起。
当在数据库中更改数据成功时,在事务中更改的数据便会提交,不再改变。否则,事务就取消或者回滚,更改无效。
四大特性:
数据库的事务隔离级别有四种: 读未提交、读已提交、可重复读、序列化
不同的隔离级别下会产生脏读、幻读、不可重复读等相关问题,因此在选择隔离级别的时候要根据应用场景来决定,使用合适的隔离级别。
各种隔离级别和数据库异常情况对应情况如下:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
| READ-UNCOMMITTED | √ | √ | √ |
| READ-COMMITTED | × | √ | √ |
| REPEATABLE-READ | × | × | √ |
| SERIALIZABLE | × | × | × |
MySQL数据库为我们提供的四种隔离级别:
1. Read uncommitted (读未提交):最低级别,任何情况都无法保证。
事务的修改,即使没有提交,对其他事务也都是可见的。事务能够读取未提交的数据,这种情况称为脏读
2. Read committed (读已提交):可避免脏读的发生。
事务读取已提交的数据,大多数数据库的默认隔离级别。当一个事务在执行过程中,数据被另外一个事务修改,
造成本次事务前后读取的信息不一样,这种情况称为不可重复读
3.Repeatable read (可重复读):可避免脏读、不可重复读的发生。
这个级别是MySQL的默认隔离级别,它解决了脏读的问题,同时也保证了同一个事务多次读取同样的
记录是一致的,但这个级别还是会出现幻读的情况。幻读是指当一个事务A读取某一个范围的数据时,
另一个事务B在这个范围插入行,A事务再次读取这个范围的数据时,会产生幻读
4. Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能
产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读
事务隔离机制的实现基于锁机制和并发调度。其中并发调度使用的是MVVC(多版本并发控制),通过保存修改的旧版本信息来支持
并发一致性读和回滚等特性。
因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内容),
但InnoDB 存储引擎默认使用 **REPEATABLE-READ(可重读)**并不会有任何性能损失。
在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。