事务概念:事务是指的满足ACID特性的一系列操作。
四大特性(ACID)介绍如下:
- 原子性(Atomicity): 事务被视为不可分割的最小单元,要么全部提交成功,要不都失败回滚到最初状态。
- 一致性(Consistency):一般的一致性分为强一致性、弱一致性以及最终一致性,不同的一致性级别实现起来的难度不一样,最好的当然是强一致性。
- 持久性(Durability):一旦事务提交,对事务所做过的所有修改将会永久保存到数据库中,即便数据库系统遇到故障也不会丢失提交过的数据操作。
- 隔离性(Isolation):数据库中可能同一时间会有多个事务执行,多个事务之间就必须要互相不影响指的就是隔离性。
隔离性可以分为多种,在介绍不同隔离级别前,先了解如果没有隔离性的情况下,在并发的时候,数据库会出现哪些问题,主要会出现脏读、不可重复读、幻读的问题。
- 脏读:事务A修改了数据d,但是事务A还没执行完毕提交,然后此时事务B读取到数据d,此时读取到事务A修改过的数据d,然后事务A可能后续处理异常,然后回滚把对d的修改给撤回了,此时B已经读取到了事务A修改后的数据,所以B中的数据d是异常数据,这个过程就是脏读。
- 不可重复读:事务A在执行过程中,涉及到多次读取某一条数据,假设A第一次读取数据d,过了一会儿再来读取d,而这个过程中又有事务B对数据进行修改并提交,所以就会导致A读取到B提交后的数据,导致A读取到的d的数据两次是不一样的。
- 幻读:事务A多次读取某个范围内的数据(例如select * from t where age>10 and age <20),这种范围读取数据的时候,第一次可能查到十条数据,然后过了一会儿第二次查询可能查到十一条数据,这多出的一条可能就是因为有个事务B在这期间插入了一条数据,导致A第二次查询的时候得到的结果不一样,这就是所谓的幻读。
为了解决以上问题,指定了不同的事务隔离级别,最好的当然是以上全部现象都能杜绝,但是针对不同系统业务的需求以及性能要求,可能不需要严格满足所有情况下的安全问题,所以不同的事务隔离级别就可以解决这个问题,这里的隔离级别主要有:
- 未提交读(Read Uncommitted):这种其实算是没有隔离的,就是事务中只要修改的内容,即便没有提交,对其它事务也是可见的。
- 提交读(Read Commited):一个事务所做的修改,只有提交之后才会对其它事务可见。即加入事务A修改了数据d1/d2/d3,则只要它没有最后提交修改,那么事务B在读取d1/d2/d3的数据的时候都只能读取到没有修改的数据,只有事务A提交后,事务B才能读取到A修改的内容。
- 可重复读(Repeatable Read):保证在同一个事务中多次读取同样数据的时候保证两次读取到的数据是一样的。
- 可串行化(Serializable):最高级别的隔离级别,这种情况下所有事务串行处理,所以任何并发导致的问题都不是问题了,但是这种级别的性能肯定是有很大损失的。
对于MySQL而言,默认的事务隔离级别是RR(可重复读)!!