开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情
事物的ACID特性
(1)Atomic:原子性,就是一堆SQL或者代码处理逻辑,要么一起成功,要么都别成功,不允许某个SQL或者代码执行成功了,某个SQL或者代码执行失败了,这就不是原子性。
(2)Consistency:一致性,这个是针对数据一致性来说的,就是一组SQL执行之前,数据必须是准确的,执行之后,数据也必须是准确的。比如最经典的转账问题,A账户有100块钱,B账户有10块钱,A向B转账50块,转完后,A账户有50块,B账户有60块,这就是满足一致性了,如果转完钱之后,A是50块,B还是10块,那就不满足一致性。
(3)Isolation:隔离性,这个就是说多个事务在跑的时候不能互相干扰,比如事务A操作某个数据,弄到一半儿还没弄好呢,结果事务B来修改了这个数据,导致事务A的操作出错了,那不就差生问题了。
(4)Durability:持久性,事务成功了,就必须永久对数据的修改是有效的,比方说过了一会儿数据自己没了,不见了,那就是不满足持久性了。
事务隔离级别
(1)读未提交,Read Uncommitted:这个是隔离级别最低的,就是说当某个事务还没提交的时候,修改的数据,就让别的事务给读到了,这就恶心了,很容易导致出错的。这个也叫做脏读。
(2)读已提交,Read Committed(不可重复读):这个比上面那个稍微好一点,但是一样问题比较大,就是说事务A在跑的时候, 先查询了一个数据是值1,然后过了段时间,事务B把那个数据给修改了一下还提交了,此时事务A再次查询这个数据就成了值2了,这是读了人家事务提交的数据啊,所以是读已提交。这个也叫做不可重复读,就是所谓的一个事务内对一个数据两次读,可能会读到不一样的值。
(3)可重复读,Read Repeatable:这个就是比上面那个再好点儿,就是说事务A在执行过程中,对某个数据的值,无论读多少次都是值1;哪怕这个过程中事务B修改了数据的值还提交了,但是事务A读到的还是自己事务开始时这个数据的值。
(4)串行化:幻读,不可重复读和可重复读都是针对两个事务同时对某条数据在修改,但是幻读针对的是插入,比如某个事务把所有行的某个字段都修改为了2,结果另外一个事务插入了一条数据,那个字段的值是1,然后就尴尬了。第一个事务会突然发现多出来一条数据,那个数据的字段是1。如果要解决幻读,就需要使用串行化级别的隔离级别,所有事务都串行起来,不允许多个事务并行操作。