事务
事务就是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功的对数据库应用改组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有语句都不会执行。也就是说事务内的语句,要么全部执行成功,要么全部执行失败。
事务的ACID特性
一个运行良好的事务处理系统,必须具备ACID特性。
- 原子性(atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。
- 一致性(consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态。拿银行转账事务来说,就算中间失败了。也会回滚不会导致数据的不正确。
- 隔离性(isolation):通常来说,一个事务所做的修改在最终提交之前,对其他事务是不可见的。也就是说一个事务的执行不会影响到另一个事务的一致性。后边会有详细的关于隔离性的隔离级别。
- 持久性(durability):一旦事务提交,其所做的修改就要永久的保存到数据库中。此时就算系统崩溃,也要保证修改后的数据不能丢失。
隔离级别
- READ UNCOMMITTED(未提交读):
在READ UNCOMMITTED级别,事务中的修改,即使没有提交,对其他事务也是可见的。事务可以读取未提交的数据,这也可以称为是脏读。这个级别会出现很多问题。从性能上来说。READ UNCOMMITTED不会比其他级别好太多,并且缺乏其他好处。这个隔离级别应用非常少 - READ COMMITTED(提交读):
oracle系统默认的隔离级别是READ COMMITTED,READ COMMITTED满足前边提到的隔离性的定义:一个事务开始时,只能看见已经提交的事务所做的修改。换句话说,一个事务从开始直到提交前,所做的任何修改对其他事务都是不可见的。这个级别也叫不可重复读,因为一个事务中读取的数据可能因为别的事务两次修改而看到不一样的结果。 - REPEATABLE READ(可重复读):
mysql系统默认的隔离级别是REPEATABLE READ,REPEATABLE READ解决了脏读的问题,同样也解决了不可重复读的问题。
但是出现了幻读的问题。幻读:指的是当某个事务在读取某个范围的数据时,另外一个事务在该范围内插入了一条新的记录。当之前的事务再次读取该范围的记录时,会多出这一条数据。 -
SERIALIZABLE(可串行化):
SERIALIZABLE是最高的隔离级别。它通过强制事务串行执行,避免了前边所出现的幻读问题。简单来说,SERIALIZABLE会在读取每一条数据都加锁。所以可能导致大量的超时和锁争用问题。实际开发中,很少用到这种隔离级别。