数据库事务的四个特性(ACID)、事务的隔离级别
事务是一个不可分割的最小逻辑工作单元。
事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持久性( Durability )。
原子性:整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作。
一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。例如:A给B汇款,无论汇款是否成功,A和B钱的总金额是不变的。
隔离性:一个事务的执行不能干扰其它事务的执行。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性:一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。
事务的四个隔离级别:
读未提交:事务A读取了事务B更新了但是没有提交的数据。
读已提交:事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
重复读:事务A读取了记录,事务B就不能对该记录进行修改,但是事务B可以读取该记录。MySQL的默认隔离级别就是Repeatable read。
序列化:提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
脏读:在一个事务处理过程里读取了另一个未提交的事务中的数据。
不可重复读:事务A读取了一行记录,紧接着事务B修改了事务A刚才读取的那一行记录,然后事务A又再次读取这行记录,发现与刚才读取的结果不同。
幻读:当用户读取某一个范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现会有新的“幻影行”,例如:事务B读某一个数据M,事务A对数据M增加了一行并提交,事务B又读数据M,发生多出了一行造成的结果不一致(如果行数相同,则是不可重复读)。