事务的ACID特性:
1、Atomicity原子性 事务操作的不可分割性,要么全部执行,要么回滚。
2、Consistency一致性 数据库在事务处理前后处于的一致性状态。如银行转账,两个账户转账前的状态和转账后的状态必须一致。
3、Isolation隔离性 同一时刻执行多个事务,一个事务的执行不能被其他事务干扰。
4、Durability持久性 持久性指一旦成功执行,在系统中产生的所有变化将是永久的。
事务的隔离级别是事务并发控制的整体解决方案,是综合利用各种类型的锁机制解决并发问题的整体解决方案。
首先了解一下常见的并发问题:
1、脏读:一个事务可以读到另一个事务未提交的数据,违背了事务的隔离性原则。
2、不可重复读:同一个事务内,两条相同的查询语句的查询结果不一致。
3、幻读:屏蔽了对其他用户修改数据的查询,等到提交时发现出错了。
这三个并发问题的出现都是在前一问题的基础之上发生的,
比如,脏读问题可以这样理解,客户A从数据库读取数据行到内存并修改,但是还没有提交,此时客户B也要读取这一行,但是这个读取是在内存中读取的客户A未提交的数据。
不可重复读是在解决了脏读的情况下,不再读取未提交的数据,而是从数据库中直接读取已经提交的数据,但是这样会在同一事务中产生一个问题,就是两次查询的结果可能不一致,比如第一次查询在客户端提交前,第二次查询在客户端提交后,结果这两次查询结果不一致。
幻读问题是在解决了不可重复读问题的前提下,即同一事务中重复查询的结果一致,但是这又会产生新的问题,比如第一次查询是否存在某个用户,假设不存在,此时客户B插入这个用户,此时这个事务的隔离界别是可重复读,那么再次查询这个用户肯定还是不存在,但是此时数据库中已经存在了这个用户,客户A再次插入的话必然会产生duplicate错误。
为了解决这些并发问题,SQL定义了四种隔离级别:
read uncommitted(读取未提交的数据) 可能存在 以上三种问题
read commited 读取提交的数据 解决了脏读问题 但是存在不可重复读和幻读
repeated read 可重复读 解决了脏读和不可重复读,但是存在幻读现象
serializable 串行化 解决了脏读,不可重复读和幻读现象,但是发生了锁等待现象,降低了事务间的并发访问性能。