面试

数据库锁及事务整理

2018-01-11  本文已影响0人  John13

参考文档

MySQL的事务和隔离级别
理解事务 - MySQL 事务处理机制
《MySQL技术内幕》读书笔记
一文说尽MySQL事务及ACID特性的实现原理 --- 很棒
史上最全MySQL锁讲解:页锁、共享锁、行锁、表锁、悲观锁、乐观锁

1、数据库物理事务隔离级别

MySQL使用可重复读作为默认隔离级别的原因

2、锁策略

乐观锁(Optimistic Lock)和悲观锁(Pessimistic Lock)

选择标准
如果并发量不大,或数据冲突的后果不严重,则可以使用乐观锁;
而如果并发量大或数据冲突后果比较严重(对用户不友好),那么就使用悲观锁。

3、数据库锁分类

从读写角度分的,也叫读锁(Read Lock)和写锁(Write Lock)。

  • 持有S锁的事务只读不可写。
    如果事务A对数据D加上S锁后,其它事务只能对D加上S锁而不能加X锁。

  • 持有X锁的事务可读可写。
    如果事务A对数据D加上X锁后,其它事务不能再对D加锁,直到A对D的锁解除。

从锁的粒度角度,主要分为表级锁(Table Lock)和行级锁(Row Lock)。

  • 表级锁将整个表加锁,性能开销最小
    用户可以同时进行读操作。当一个用户对表进行写操作时,用户可以获得一个写锁,写锁禁止其他的用户读写操作。写锁比读锁的优先级更高,即使有读操作已排在队列中,一个被申请的写锁仍可以排在所队列的前列。

  • 行级锁仅对指定的记录进行加锁
    这样其它进程可以对同一个表中的其它记录进行读写操作。行级锁粒度最小,开销大,能够支持高并发,可能会出现死锁。

MySQL的MyISAM引擎使用表级锁,而InnoDB支持表级锁和行级锁,默认是行级锁。
还有BDB引擎使用页级锁,即一次锁定一组记录,并发性介于行级锁和表级锁之间。

4、Spring管理逻辑事务的方式

编程式事务就是利用手动代码编写事务相关的业务逻辑,这种方式比较复杂、啰嗦,但是更加灵活可控制(个人比较喜欢)

1.为了避免我们每次都手动写代码,利用Spring AOP的方式对每个方法代理环绕,利用xml配置避免了写代码。

5、Spring逻辑事务传播行为

Spring管理的事务是逻辑事务,而且物理事务和逻辑事务最大差别就在于事务传播行为,事务传播行为用于指定在多个事务方法间调用时,事务是如何在这些方法间传播的,Spring共支持7种传播行为

总结,只有传播性为
PROPAGATION_REQUIRED
PROPAGATION_REQUIRES_NEW
PROPAGATION_NESTED
时候才可能开启一个新事务。

上一篇下一篇

猜你喜欢

热点阅读