数据库四大特性及数据库隔离级别

数据库的四大特性ACID:

1. 原子性(Atomicity)

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。

2. 一致性(Consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

3. 隔离性(Isolation)

隔离性是指当用户并发访问数据库时,多个并发事务之间,应当相互隔离。(最差的是,串行执行即一个事务执行完成之后,另一个事务在执行)

4. 持久性(Durability)

持久性是指事务的操作,一旦提交,对于数据库中数据的改变是永久性的

由不同隔离性引发的数据不一致性:

1. 脏读

脏读是指一个事务读取了未提交事务执行过程中(包换了多次的dml,但是未提交事务,随时可能回滚)的数据。

eg:当一个事务的操作正在多次修改数据,而在事务还未提交的时候,另外一个并发事务来读取了数据,就会导致读取到的数据并非是最终持久化之后的数据,这个数据就是脏读的数据。

2.不可重复读

不可重复读是一个事务执行过程中,另一事务提交并修改了当前事务正在读取的数据,导致当前事务读取到了不同的数据。(乐观锁实现原理,靠不可重复读触发数据不一致,来数据回滚)

3.幻读:

幻读和不可重复读都是读取了已经提交的事务(这点同脏读不同),不可重复读查询的都是同一个数据项而幻读针对的是一批数据整体(比如数据的个数)。

MySQL定义了四种隔离级别:(依次是:读未提交,读已提交,可重复读,串行读取)

补充:

repeatable read是mysql默认事务隔离级别

read commited是大多数数据库的默认隔离级别

serializable级别是最高级别的隔离级。它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简而言之,SERIALIZABLE是在每个读的数据行上加锁。在这个级别,可能导致大量的超时和锁竞争现象,实际应用中很少使用到这个级别,但如果用户的应用为了数据的稳定性,需要强制减少并发的话,也可以选择这种隔离级

锁机制

共享锁(读锁:大家能读)

读表时加锁,加锁后其他用户只能获取该表或行的共享锁,不能获取排它锁,也就是说只能读不能写

排它锁(写锁:个人能写)

写表时加锁,加锁后其他用户不能获取该表或行的排他锁,共享锁

表锁

给整张表加锁

行锁

给行数据加锁

因此锁可以分为表级共享锁行级共享锁表级排它锁行级排它锁


转载:https://www.jianshu.com/p/b0d0c0b04fb7
原文地址:https://www.cnblogs.com/brxHqs/p/9723817.html