关于数据库的事务特性以及隔离级别,老是混淆忘记,今天打算写一篇文章记录一下
一、事务的特性:ACID
ACID: - 原子性(Atomicity):一个事务要么全部执行,要么全都不执行 - 一致性(Consistency):事务前后数据的完整性必须保持一致 - 隔离性(Isolation):事务之间互不干扰 - 持久性(Durability):事务一旦提交,对数据库的改变是永久性的 二、事务隔离性:
- 脏读:指在一个事务处理过程里读取了另一个未提交的事务中的数据【读到了另一个事务还没有提交的数据】 - 不可重复读【修改】:在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值【这是由于在查询间隔,被另一个事务修改并提交了】 - 幻读/虚读【新增】:幻读是事务非独立执行时发生的一种现象【例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。】 【幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)】
三、数据库隔离级别:
- 读未提交【Read uncommitted】:最低级别,任何情况都无法保证 - 读已提交【Read committed】:可避免脏读 (oracle默认级别) - 可重复读【Repeatable read 】:可避免脏读,不可重复读 (mysql默认级别) - 串行化【Serializable】:可避免脏读、不可重复读、幻读的发生 隔离级别越高,执行效率越低