什么是事务?
-
事务就是一条或多条语句组成一组执行单位,通俗点讲就是,统一化的操作。
-
一旦事务开始,就不可被外部操作(其他线程的指令操作)打断,关机和断电除外。 因为操作是统一的,所以要么操作成功,持久化存储。要么操作失败,回滚到操作前的状态,什么事也没发生。
为什么要有事务?
- 在操作某个程序时候,我们不希望在这个操作的过程中会被其他线程干扰,这个时候就要用到事务了。一旦使用事务操作,操作的过程将不受其他线程的干扰,直到完成或回滚才会解除事务状态。
- 举个例子:QQ早些年的时候,有个好友弹窗抖动功能。如果你当时在玩游戏,全屏的那种,好友突然给你发个弹窗抖动,那么你的游戏会被强制缩小,QQ聊天框会强制挂在屏幕中间(你是否有种化身祖安人的冲动-_-)。如果当时你的游戏是以事务方式运行,那么除非你自己缩小游戏,否则将不受QQ弹窗抖动的影响。
事务的特点
- (Atomicity)原子性:一个事务是不可再分割的整体,要么都执行要么都不执行
- (Consistency)一致性:一个事务可以使数据从一个一致状态切换到另外一个一致的状态
- (Isolation)隔离性:一个事务不受其他事务的干扰,多个事务互相隔离的
- (Durability)持久性:一个事务一旦提交了,则永久的持久化到本地
事务的隔离级别(举例:mysql,以下隔离级别中oracle只有第二个和第四个)
-
read uncommitted(RU):读未提交 第一个隔离级别,也是安全性最低的级别,会出现脏读(读为提交),不可重复读(读已提交),幻读等特征。
-
read committed(RC):读已提交 第二个隔离级别,消除了脏读现象,但是还存在不可重复读和幻读现象。
-
repeatable read(RR):可重复读 第三个隔离级别,消除脏读,不可重复读,半个幻读(为什么是半个?后期会出一篇文章讲解),这个隔离级别是mysql的默认级别。基本消除各种不良现象。
-
serializable(串行化):最高级别 第四个隔离级别,最高级的,也是安全性最好的,但是效率也是最低的。
-
隔离级别由高到低,级别越低性能越好,但是安全性越差,具体取舍要根据实际业务来选择,小型业务,滚键盘选默认即可。
每个隔离级别的通俗介绍
-
脏读(读为提交): A开启事务操作一个数据时,它在事务中有两次查询操作,第一次查询显示的数据时1。 然后B也开启事务操作这个数据,B把这个数据改成2,但是没提交,这个2就是临时数据, 然后A在执行第二次查询,此时读取到了这个2。注意,B还没提交事务,这就是脏读"
-
不可重复读(读已提交): A开启一个事务,它在事务中有两次查询操作,第一次查询数据是1, B此时开启一个事务,B修改了这个数据,然后提交了。注意:是提交了。 此时,A在自己事务中执行第二次查询,会发现能查询到B修改并提交的数据。
-
幻读: A 开启一个事务,它在事务中有两次查询操作,查询是查询当前表的所有数据,假设现在有10条数据,此时A第一次查询查出的就是10条数据。 这时 B 开始一个事务,对这个表插入了一行新数据,并且提交了。 此时A进行第二次查询,会发现查询到了11条数据,多出的1条数据就好像产生幻觉一样,这就是幻读。
-
串行化: 直接加悲观锁,排队等待,只能一个个执行。
数据库事务示例代码
1.查询和修改,提交操作
#开启一个事务
BEGIN;
#查询操作
SELECT * FROM `person` WHERE id = 7
#修改操作
update `person` set name = '8877' WHERE id = 7;
#结束一个事务
COMMIT;
- 查询和修改,回滚操作
#开启一个事务
BEGIN;
#查询操作
SELECT * FROM `person` WHERE id = 7
#修改操作
update `person` set name = '8877' WHERE id = 7;
#回滚一个事务
ROLLBACK;
- 各位可以根据代码,一行行的执行,先开启事务,然后查询,修改,在查询一次,然后在提交或者回滚,查看事务操作数据的变化。
总结
- 事务就是一段连续不可分割的操作。
- 事务有4个特点以及4个隔离级别,4个特点分别是ACID,4个隔离级别分别是读未提交,读已提交,可重复读,串行化。
- 要想使用事务,必须使用事务指定的指令,BEGIN开始,COMMIT提交,ROLLBACK回滚。
- mysql事务的默认隔离级别为RR模式,也就是可重复读,mysql有4个隔离级别,而oracle的隔离级别只有两个,分别是RC读已提交,readonly只读,串行化,这三个隔离级别。oracle的默认隔离级别是rc模式,和mysql还是有区别的.