数据库作为全局公用资源,可以跨越多个应用进程来实现分布式锁,同理其它公共中间件也可以作为分布式锁的实现,如redis和zookeeper,也可以将操作共享资源的应用作为单体应用。本文将基于数据库实现分布式锁,分为乐观锁和悲观锁,可以使用数据库客户端工具测试验证,客户端执行sql等同于应用代码。乐观锁类似java的aqs,主要是通过version版本号来控制数据记录的更新操作。操作数据记录时,会首先获取当前version版本号,执行更新时将version作为更新条件,同时更新版本号version+1。
悲观锁类似java的synchronized,同一时间只能由一个线程访问该数据记录,其它线程访问时会出现阻塞,只有获取锁的线程执行完成之后,其它线程才可以竞争获取锁继续操作。
----
乐观锁适合读操作远大于写操作的场景,否则共享数据频繁更新就需要频繁获取版本号,造成数据库服务器压力。悲观锁适合并发请求不大的场景,否则频繁的读数据就会给数据库服务器带来压力,而且可能会因为多表操作引发死锁问题。