什么是事务
一、事务的概念
事务就是一组独立不可分割的工作单元,事务中的操作要么全部执行,要么都不执行。
二、事务的四大特性(ACID)
1、原子性(Automatic)
事务中的所有的操作要么是全部成功要么是全部失败,不会存在事务中操作部分失败,部分成功的情况。
2、一致性(Consistent)
执行事务前操作的数据的状态和执行事务后所操作数据的状态是一致的,例如:我们操作数据库以一个事务操作从A用户的账户中转账200元到B用户的账户中,操作前A账户有1000元,B账户有200元,其中涉及到两个操作从A账户扣减200元,往B账户增加200元,在事务的操作成功提交后,A账户有800元,B账户有400元。事务操作前A、B账户的总额为1200元,事务操作后A、B账户的总额仍是1200元。A、B的总额在事务的操作前后都是一致的。如果在执行这个事务的操作的过程中出现错误,则事务不成功,整个事务操作都是失败的,不存在部分成功部分失败的情况,则在事务操作后的A、B账户的总额仍是1200元。
3、隔离性(Isolation)
通常来说事务的操作在最终提交前,对其他事务的来说都是不可见的。但是隔离性在不同的隔离级别下却不一定总是满足以上的描述。
4、持久性(Duration)
一个事务的操作在提交成功操作后,数据库中所做的修改就是永久性的,即使是数据库系统故障崩溃,事务的修改都不会丢失。
三、事务的隔离性和隔离级别
1、读未提交(Automatic)
在一个事务操作的过程中对于一个数据做了修改还未提交的时候,其他的事务可以立即读取到这个事务对于该数据的修改。在此种情况下会出现脏读的现象,即因为在事务尚未提交的时候其他事务读取到了该事务修改的数据,若该事务提交失败出现回滚,则该数据修改并没有生效,其他事务读取到的是无效值。
2、读已提交(Automatic)
一个事务操作过程中的修改必须等到事务的修改提交成功后,才可以被其他事务读取到。在此种情况下能解决脏读现象问题,因为事务在读取到的数据都是其他事务已经操作提交成功的,不会出现读取到提交失败的脏数据。但是会出现不可重复读的问题,因为事务在操作的过程中,如果两次读取的另一个事务操作修改的数据,一次读取是在事务提交前,另一次读取是在事务提交后,就会出现在同一个事务中多次读取到的数据的值是不一致的。当然,在读未提交的隔离级别下,也会出现这个问题。
3、可重复读(Automatic)
一个事务在操作的过程中,读取到的数据在整个事务的操作过程中是不会变的,即使是在这个事务的过程中,其他的事务对这个事务读取的数据做了修改。这个隔离级别可以解决不可重读的问题,但在这个事务隔离级别中会出现幻读的现象,即在事务读取某个范围的数据记录时,另一个事务在这个范围内数据插入了一行新数据并提交成功,导致在这个插入操作前后,当前事务两次查询出来的记录数是不一致的。此现象称为幻读,前两个隔离级别也是存在这个问题的。
4、串行化(Automatic)
数据库中对于同一条数据的事务操作都是串行进行的,对于同一条数据的操作不存在并行执行的情况。当然前面的说的脏读,不可重复读,幻读问题都是由于事务在操作同一条数据时需要并行执行才会出现的问题,在这个隔离级别下,由于对于同一条数据事务的操作都是串行化,便不存在上述提到的所有问题了。
虽然随着隔离级别的提升,可以解决相对于上一个隔离级别中存在的问题,但是随着隔离级别越高(即隔离得越严实),系统的效率就越低。