一:事务的概念
所谓事务,即一件事,那么完成一件事肯定有很多个步骤,所以事务实际就是很多个步骤的集合。即事务实际就是增删改等一系列数据库操作的集合
二:事务的四大特性(ACID)
1.原子性:集合里的操作要么都成功,要么都失败
2.一致性:数据修改前后状态是一致的
3.隔离性:多个事务之间是互相独立的,可以同时进行的
4.持久性:类似数据的持久性
三:隔离级别的存在引起的问题
由于隔离性存在隔离级别,当事务并发时,其中一个事务在读取事务时必然会出现一些问题(类似多线程的安全问题),事务并发读取数据时出现的问题大致可以分为三种
1.脏读
顾名思义,脏读就是读取了脏数据,所谓脏数据,就不正确的数据。众所周知,事务是需要提交的,当事务B读取到事务A未提交时的数据称为脏读。比如事务A修改了某个数据,但是该事务没有提交。但是在其他事务中,读到了被该事务更新后的值。(实际上事务没有被提交,表中的记录也不会改变,会造成一种读到的数据与表中的数据不一致,也就是所谓的读到了脏数据)
2.不可重复读
顾名思义,就是数据经不起重复读取的考验。在一个事务内连续读取同一数据两次及以上,但是读取到的数据都是不同的,那么就称为不可重复读(在第二次读取之前,有另外一个事务修改了数据)
3.幻读
顾名思义,幻读,就像多次读取的过程中像出现了幻觉一样,比如在同一事务中,第一次读的时候只有一条数据,但是第二次读的时候有两条数据。与不可重复读不同的是,幻读的多次读并不是读同一数据,而且发生的变化是数据的数量发生变化了
四:隔离级别
隔离性有四个隔离级别,每一个隔离级别都会导致不同的问题;换个角度想,不同的隔离级别可以解决不同的问题(默认是可重复读)
1.读未提交
允许事务B读取事务A未提交的数据,因此脏读,不可重复读,幻读都会出现
2.读已提交
事务B只能读取事务A提交后的数据,因此不会出现脏读,但是会出现不可重复读和幻读。比如出现不可重复读的原因:事务B与事务A一开始同时读取到a=1,但是事务A修改a为2后提交,然后事务B再次读取时a为2,就出现了前后数据不一致
3.可重复读
保证同一事务多次读取同一数据的结果是一样的,但是未解决幻读的问题,事务并发时不会出现脏读与不可重复读以及幻读
4.串行化
顾名思义,就是把事务一个一个地执行,不让事务并发执行。类似于把事务全部放进队列,一个一个地执行,完美地解决了三个问题,但是带来的是性能上的消耗(因为无法并行执行了!)
一般来讲,涉及数据库多个操作的业务都应该加上事务控制,避免在多个操作的过程中因有一个操作异常而使得插入或修改了错误的数据,使得数据的状态不一致,如正常情况下订单创建成功从而减少用户余额,若订单创建失败了,但是用户却余额减少了,那么数据的状态就被破坏了,添加事务控制后,就可以通过回滚从而使得数据状态依然一致。
最后:附上后端技术交流圈,欢迎各位大佬入圈交流.......(先添加好友后拉群,添加好友时请备注:小白不黑)