mysql事务是指将数据库从一种一致性状态转到另一种一致性状态
mysql事务具有ACID特性:
原子性(Atomicity):事务中的所有操作,要么全部执行,要么都不执行
一致性(Consistency):事务开始和结束后,数据库的完整性不会被破坏
隔离性(Isolation):事务之间互不影响。事务的隔离级别有四种:读未提交、读已提交、可重复读(默认隔离级别)、串行化
持久性(Durability):事务提交后,对数据的修改是永久性的,即使系统故障也不会丢失
mysql事务的隔离级别
读未提交(read uncommited):即事务对数据库数据所做的修改,在事务未提交之前,可以被其他事务看到。A事务对数据库数据做的修改,在A事务未提交时,事务B可读到A事务对数据所做的修改。
容易产生的问题:脏读。由于事务B可读到事务A所做的修改,但是A并没有提交,如果事务A执行过程中发生异常回滚,则会导致事务B读到的是错误数据,即脏数据
读已提交(read commited):A、B两个数据同时对数据库中同一条数据做修改,A事务开启,读取数据,此时,B事务也开启,读取数据,并对数据做出修改,然后提交,此时事务A继续执行,执行完后,再次读取数据,发现两次读取的结果不一样,由此产生不可重复读的问题。
可重复读(repeatable read):A事务读取数据库数据,在处理业务的过程中事务B读取数据并修改完成后,事务A再次读取数据时,所得结果和之前读取的数据一致,并且事务A提交后,不会损害数据的一致性。原理是mysql使用了MVCC的版本控制机制,读事物开始时,系统会给当前读事物一个版本号,读事物后续读取的版本号都会<=当前版本号,导致当前的读事物无法读取到数据的最新版本(这里要说明一下,如果在B事物修改数据后A再修改数据并重新读取数据,是可以读取到最新的数据的)。可能产生的问题:幻读。如:事务A开启,读取用户x的age为15,B事务开启age读取用户x的age并加1,此时用户x的age为16,A事务再次读取用户x的信息发现age还是15,A事物将x用户的age+1,提交后,发现x用户的age值为17.从用户的角度来看,数据的一致性并没有被破坏,但A事务可能将读取到的数据15返回给用户,导致幻读。
串行化(serializable):表上的一个事务开启后,在该事务提交之前,其他事务不能对表中的数据做任何修改。该隔离级别会锁表。