一、简介
MySQL中的事务是恢复和并发的控制基本单位,因此,如何使用事务以及选择事务的隔离级别,对于mysql十分重要
二、事务的特征ACID
事务有如下四个特征,分别为原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability),简称ACID
1、原子性
原子性指的是一个事务,要么全部执行成功,要么全部不执行,像一个原子一个不可分割。如转账操作,A转给B金额100,首先A的余额-100,然后B的余额+100。转账操作要么都完成,要么都不完成。
2、一致性
一致性指的是一个事务,在事务开始执行前的状态,和事务结束之后的状态,是一致的。比如转账操作,事务开始前,A和B的余额假设总和是1000,那么A转给B金额100后,A和B的余额总和仍然是1000。
3、隔离性
隔离性指的是多个事务在执行过程中,是相互隔离的,互不影响。其中,事务的隔离级别在mysql中共有四种
4、持久性
持久性指的是事务提交完成之后,数据库对数据的保存是永久的,不会因为服务器宕机而导致数据丢失。如JDBC向数据库提交数据后,数据在数据库中必须永久保存。
三、事务出现的问题
事务是并发控制的基本单位,因此多个事务并行执行会导致一定的问题,可能产生的问题如下:
1、脏读
脏读指的是一个事务,读取了另一个事务中未提交的数据。那么,当另外的事务由于错误而回滚时,将导致第一个事务读取错误。
2、不可重复读
不可重复读指的是,一个事务中,两次读取同一个内容,但是读取到的数据却不相同。导致的原因是第二次的数据,被另一个事务修改并提交了事务。
3、幻读
幻读出现在一个非独立事务时,将可能导致发生。比如一个事务的有两个操作,第一是将所有的账户余额全部初始化为0,第二步是查询修改后的结果。但是第二步修改查询修改后的结果时,却发现有一条数据账户余额是100.导致的原因是,另一个事务插入了一条账户余额为100的数据,并提交了事务。因此将导致幻读现象。
四、事务的隔离级别
mysql中提供了四种事务的隔离级别,隔离级别越高,可以处理以上的问题越多,但性能越差
1、读未提交read uncommitted
可能导致的问题是脏读、不可重复读、幻读
2、读已提交read committed
可能导致的问题是不可重复读、幻读,可以解决脏读现象。
3、可重复读repeatable read(MySQL的默认隔离级别)
可能导致的问题是幻读,可以解决不可重复度、脏读现象。
4、串行化serializable
可以解决脏读、不可重复读、幻读,性能最差