原子性(Atomicity):一个事务的所有操作,要么全部执行,要么全部不执行。
一致性(Consistency):执行事务时保持数据库从一个一致的状态变更到另一个一致的状态。
隔离性(Isolation):即使每个事务都能确保一致性和原子性,如果并发执行时,由于它们的操作以人们不希望的方式交叉运行,就会导致不一致的情况发生。确保事务与事务并发执行时,每个事务都感觉不到有其他事务在并发地执行。
持久性(Durability):一个事务完成之后,即使数据库发生故障,它对数据库的改变应该永久保存在数据库中;
了解了ACID后,我们来看看脏读、不可重复读、幻读的定义:脏读。当第一个事务读取了第二个事务中已经修改但还未提交的数据,包括INSERT、UPDATE、DELETE,当第二个事务不提交并执行ROLLBACK后,第一个事务所读取到的数据是不正确的,这种读现象称作脏读。
不可重复读。当一个事务第一次读取数据之后,被读取的数据被另一个已提交的事务进行了修改,事务再次读取这些数据时发现数据已经被另一个事务修改,两次查询的结果不一致,这种读现象称为不可重复读。
幻读。指一个事务的两次查询的结果集记录数不一致。例如一个事务第一次根据范围条件查询了一些数据,而另一个事务却在此时插入或删除了这个事务的查询结果集中的部分数据,这个事务在接下来的查询中,会发现有一些数据在它先前的查询结果中不存在,或者第一次查询结果中的一些数据不存在了,两次查询结果不相同,这种读现象称为幻读。幻读可以认为是受INSERT和DELETE影响的不可重复读的一种特殊场景。
清晰了这些概念后,我们动手来MySQL上实验一下。实验开始前,我们先创建测试用的表:CREATETABLEtbl_mvcc(idINTNOTNULLAUTO_INCREMENT,ivalINT,PRIMARYKEY(id));
(1)脏读的实验
--未提交读级别setsessiontransactionisolationlevelreadun