本篇文章主要讲解数据库中事务的四大特性(ACID)和事务的隔离级别。
一个支持事务操作的数据库必须要具备以下四个特性:
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
事务前后数据的完整性必须保持一致。比如A向B转账,A扣100元,B收到100元,符合逻辑运算。
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
指当一个事务正在访问数据,并且对数据进行了修改,而这种数据还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据还没有提交那么另外一个事务读取到的这个数据我们称之为脏数据。根据脏数据所做的操作肯能是不正确的。
指在一个事务内,多次读同一数据。在这个事务还没有执行结束,另外一个事务也访问该同一数据,那么在第一个事务中的两次读取数据之间,由于第二个事务的修改第一个事务两次读到的数据可能是不一样的,这样就发生了在一个事物内两次连续读到的数据是不一样的,这种情况被称为是不可重复读。
是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。(一般是行影响,比如:多了一行)。
不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
Mysql数据库事务的隔离级别有4种,由低到高分别为Read uncommitted(读未提交)、Read committed(读已提交)、Repeatable read(可重复读)、Serializable(串行化)。
这种事务隔离级别下,select语句不加锁。此时,可能读取到不一致的数据,即“脏读 ”。这是并发最高,一致性最差的隔离级别。
可避免脏读的发生。
MySql默认隔离级别。可避免脏读、不可重复读的发生。
可避免脏读、不可重复读、幻读的发生。