数据库的并发操作和锁

209 阅读2分钟

「本文是今年日更计划第8篇文章」

数据库的并发策略

数据库的并发控制一般采用三种方式实现,分别是乐观锁、悲观锁及时间戳。

1.乐观锁

乐观锁在读数据时,认为别人不会去写其所读的数据;悲观锁就刚好相反,觉得自己读数据时,别人可能刚好在写自己刚读的数据,态度比较保守;时间戳在操作数据时不加锁,而是通过时间戳来控制并发出现的问题。

2.悲观锁

悲观锁指在其修改某条数据时,不允许别人读取该数据,直到自己的整个事务都提交并释放锁,其他用户才能访问该数据。悲观锁又可分为排它锁(写锁)和共享锁(读锁)。

3.时间戳

在数据库表中额外加一个时间戳列TimeStamp。每次读数据时,都把时间也读出来,在更新数据时把时间戳+1,在提交前跟数据库的该字段比较一次,如果比数据库的值大,就允许保存,否则不允许保存。这种处理方法虽然不使用数据库系统提供的锁机制,但是可以大大提高数据库处理的并发度。

数据库锁

1.行级锁

对某行数据加锁,是一种排他锁,防止其他事务修改此行。在执行以下数据库操作时,数据库会自动应用行级锁。

  • insert、update、delete、select ... from update
  • select ... for update语句允许用户一次针对多条记录执行更新
  • 使用commit或rollback语句释放锁

2.表级锁 对当前操作的整表加锁,它的实现简单,资源消耗较少,被大部分存储引擎支持。最常使用的MyISAM和InnoDB都支持表级锁定。表级锁定分为表共享读锁(共享锁)和表独占写锁(排它锁)

3.页级锁 页级锁的锁定粒度介于行级锁和表级锁之间。表级锁的加锁速度快,但冲突多,行级冲突少,但加锁速度慢。页级锁在二者之间做了平衡,一次锁定相邻的一组记录。

4.基于Redis的分布式锁