目录
一.事务的特性
事务具有4个属性:原子性 ,一致性 ,隔离性,持久性。这四个属性通常称为ACID特性。
a.原子性(atomicity)
一个事务必须被视为一个不可分割的最小单元,整个事务中的所有操作要么全部提交成功,要么全部失败,对于一个事务来说,不能只执行其中的一部分操作。
比如:A给B转账1000元
1.A账户余额减少1000元
2.B账户余额增加1000元
整个事务的操作要么全部成功,要么全部失败。不可能出现A账户余额扣除,但是B账户余额不增加的情况。如果原子性不能保证,就会导致一致性出现问题。
b.一致性(consistency)
一致性是指将事务从数据库一种一致性转换到另外一种一致性状态,在事务开始之前和事务结束之后数据库中数据的完整性没有被破坏。
比如:A给B转账1000元
1.A账户余额减少1000元
2.B账户余额增加1000元
减少的钱(-1000)与增加的钱(1000)相加应该为0。或者说A账户和B账户的余额加起来 ,前后应该不变。
c.隔离性(isolation)
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
如果隔离性不能保证,可能会出现以下问题:
则转完帐后A的余额还是9000元,但是B的余额已经是2000元,多出来的1000元就说不清楚了。
d.持久性(durability)
一旦事务提交,则其所做的修改就会永远保存到数据库中。此时即使系统崩溃,已经提交的修改数据也不会丢失。
二.事务并发引发的问题
事务并发主要引起的问题有三种:脏读,不可重复读,幻读。
a.脏读
当一个事务读取到了另外一个事务修改但未提交的数据,就被称为脏读
b.不可重复读
当事务内相同的记录被检索两次,且两次得到的结果不同时,此现象就被称为不可重复读
c.幻读
在事务执行过程中,另一个事务将新记录添加到正在读取的事务中时,会发生幻读
幻读与不可重复读有些类似,但是幻读重点强调读取到了之前读取没有获取的记录。另一方面幻读主要是与insert相关,而不可重复读主要与update相关。
三.SQL标准中的四种隔离级别
首先先明确一点,隔离级别越高,并发性就越低,性能也就越低,但是越安全。但是不能一味地只追求安全性,而不考虑性能。同时也不能只追求性能,不考虑安全性。二者都需要考虑,达到一个合适的度。因此,SQL标准就被制定出来了。在标准中设立了4个隔离级别。
READ UNCOMMITTED:读未提交
READ COMMITTED:读已提交
REPEATABLE READ:可重复读
SERIALIZABLE:可串行化
MYSQL的默认隔离级别是REPEATBLE READ。