事务的特性
1.原子性(Atomicity)
2.一致性(Consistency)
3.隔离性(Isolation)
4.永久性(Durability)
事务这个属性是针对数据库访问的并发性问题而言。
所谓数据库访问的并发性问题是指多个事务可以同时访问数据库中的数据,而当多个事务在数据库中并发执行(同时执行)时,数据的一致性可能出现问题,从而导致数据出现问题。
所以隔离性可能带来三个副作用,分别是 脏读、不可重复读、幻读,为了避免这三个问题的发生,在标准的sql语句中定义了4种隔离级别,分别是读未提交、读已提交、可重复读、可序列化。
1.脏读
所谓脏读就是一个事务 A 读取另一个事务 B 修改但尚未提交的数据, 并在此基础上操作,而事务 B 又执行事务回滚(也就是撤销了事务), 因为这个数据是还没有提交的数据, 那么事务A读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
2.不可重复读
所谓不可重复读就是一个事务对同一行数据重复读取两次,但是却得到了不同的结果。
事务A两次读此数据之间,事务B对数据进行修改,那么事务A读到的数据是不一样的,因此称为是不可重复读。
3.幻读
事务A对一个表中所有数据的某一列进行修改,同时,事务B也修改这个表中的数据, 向表中插入一行新数据。那么,事务A的用户修改后查询, 发现表中还有没有修改的数据行(事务B插入的新数据),就好象发生了幻觉一样。
数据库事务隔离级别
1.读未提交(Read uncommited)
事务A中的修改即使没有提交也会被其他事务可见,产生脏读,如果事务A回滚,则其他事务之前读到的都是脏数据。
2.读已提交(Read commited)
Oracle数据库的默认隔离级别。在事务提交之前,其他事务看不到该事务的修改结果。
3.可重复读(Repeatable read)
Mysql数据库默认隔离级别。一个事务多次查询,无论其他事务对数据如何修改,看到的数据都是一致的。事务A查询数据时,事务B同时在修改数据,事务A看到的永远是B事务执行前的数据。只有当A事务提交或回滚之后,看到的才是最新的被B事务修改之后的数据。可避免脏读、不可重复读,无法避免幻读。
4.可序列化(Serializable)
事务顺序执行,可避免脏读、不可重复读、幻读,但效率最差。因为食物A执行时,其他事务必须等待。