ACID 及事务隔离级别

常规问题,数据库ACID及mysql事务隔离级别。
重点在于事务隔离级别。

ACID

原子性(Atomicity)

数据库事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性(Consistency)

事务前后数据的完整性必须保持一致。

隔离性(Isolation)

多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

持久性(Durability)

一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

脏读、不可重复读、幻读

在说事务隔离级别之前必须先要知道事务中可能遇到的问题,不同的事务隔离级别都是为了解决遇到的问题。

脏读

一个事务读取了另一个事务还未提交的数据。

不可重复读

指在一个事务内读取表中的某一行数据,多次读取结果不同。

幻读

指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

事务隔离级别

为了解决以上这些问题,保证事务与事务之间的隔离性,数据库中对事务的隔离级别做出了限制,分别在一定程度上对以上问题进行了解决。

读未提交(Read Uncommitted)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别是最低的隔离级别,虽然拥有超高的并发处理能力及很低的系统开销,但很少用于实际应用。因为采用这种隔离级别只能防止第一类更新丢失问题,不能解决脏读,不可重复读及幻读问题。

读已提交(Read Committed)

它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别可以防止脏读问题,但会出现不可重复读及幻读问题。

可重复读(Repeatable Read)

可避免脏读、不可重复读情况的发生,这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。这种隔离级别可以防止除幻读外的其他问题。

串行化(Serializable)

这是最高的隔离级别,通过强制事务排序,要求所有事务被串行执行,不能并发执行,可避免脏读、不可重复读、幻读情况的发生。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据