事务
事务一般指要做的或所做的事,是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所做的更改都会撤回。
四大特性
ACID(事务管理)
- 原子性(Atomicity)
不可分割的操作单元,事务中所有操作,要么全部成功;要么撤回到执行事务之前的状态 - 一致性(Consistency)
事务发生前和发生后,数据的完整性必须保持一致 - 隔离性(Isolation)
事务操作之间彼此独立和透明互不影响。事务独立运行。这通常使用锁来实现。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。 - 持久性(Durability)
事务一旦提交,其结果就是永久的。
事务并发问题
脏读:是指事务1将某一值修改,然后事务2读取该值,此后事务1因为某种原因撤销对该值的修改,这就导致了事务2读取的值是无效的。
不可重复读 :是指在数据库访问时,一个事务范围内的两次相同查询却返回了不同数据。在一个事务内多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么在第一个事务中的两次读数据之间,由于第二个事务的修改,第一个事务两次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
幻读: 是指当事务不是独立执行时发生的一种现象,比如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么就会发生,操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
隔离级别
隔离级别为0 会有脏读、不可重复读、幻读。
未提交读:允许脏读,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据。
隔离级别为1 不会有脏读,但有不可重复读、幻读。
提交读:只能读取到已提交的数据。
隔离级别为2 不会有脏读、不可重复读,但会有幻读。
可重复读:无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响。
隔离级别为3 不会有脏读、不可重复读、幻读。
串行化:完全串行化的读,每次读都需要获得表级共享锁,读写互相都会阻塞。