mysql - innoDB、事务、ACID特性、锁

参考:https://www.bilibili.com/video/BV1ui4y1w7C6?from=search&seid=9894164453600625754

 

InnoDB:采用了行级锁,支持事务

具有事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版本并发的事务安全,包括ACID。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能

 

 

ACID:原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

- 原子性(Atomicity):事务是一个不可分割的单位,是一个最小的操作单元;这个单元的操作要么全部成功,要么全部不成功。如果某一个SQL语句执行失败了,那么之前执行的SQL语句要执行回滚操作。实现原理:基于**Undo log**。Undo log会记录所有操作,一旦发生回滚,数据库就会按照Undo log做相反的操作,比如记录的是插入,那么数据库便会进行删除操作。

- 一致性(Consistency):事务执行之后,数据库的完整性约束没有被破坏,事务执行前后都是一个合法的数据状态。完整性体现在比如数据库的主键要唯一,字段类型大小要符合要求,外键的约束要符合要求。一致性是事务追求的最终目标。原子性、持久性、隔离性都是为了保证数据库最终的一致性。如果另外三个特性无法保证,那么一致性肯定也保证不了

- 隔离性(Isolation):写写操作:通过锁机制,保证当前只能有一个事务来操作某个数据。

- 持久性(Durability):实现原理:redo log。数据库除了要把数据写到Buffer中去,还会把内容记录到redo log里面,如果Mysql 宕机了,那么可以通过Redo log去恢复数据。Redo log是**预写式日志**,会把要进行的修改先写入到Redo log中,再更新到Buffer中。

 

 

 

 

乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量

 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。比如Java里面的同步原语synchronized关键字的实现就是悲观锁。

悲观锁适合写操作非常多的场景,乐观锁适合读操作非常多的场景,不加锁会带来大量的性能提升。

 

posted @ 2021-06-05 15:52  mkay  阅读(48)  评论(0编辑  收藏  举报