事务机制
关系型数据库需要遵循ACID机制
具体内容如下:
- 原子性:事务是最小的执行单位,不允许分割。事物的原子性确保动作要么全部完成,要么完全不起作用
- 一致性:事务执行前后,数据库从一个一致性状态到另一个一致性状态。
- 隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各事务之间数据库是独立的。
- 持久性:一个事务提交以后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响
隔离级别:
- 读未提交:允许读取尚未提交的数据变更,可能产生脏读、幻读或不可重复读。
- 读已提交:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
- 可重复读:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- SERIALIZABLE(串行): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
什么是脏读?
脏读是当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时候,另一个事务也在访问一个数据,然后使用这个数据。
什么是幻读?
幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉一样。
什么是不可重复读?
同一个事务内,多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一个数据。那么,在第一个事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不 可重复读。