互斥锁(线程锁)
1.为什么要使用互斥锁?
线程之间共享资源,这就导致了多个线程之间资源竞争的问题
2.好处和坏处?
好处:保证了同一时间只允许一个线程的完整执行 坏处:阻止了线程的并发执行,效率降低 由于可以存在多个锁,不同的线程持有不同的锁,并获取对方的锁,可能会造成死锁
import threading # 创建锁 mutex = threading.Lock() # 锁定 mutex.acquire() #释放 mutex.release()
死锁
在线程间共享多个资源时,如果两个线程分别占有一部分资源,并且同时等待对方的资源,就会造成死锁
避免死锁
- 程序设计时尽量避免(银行家算法)
- 添加超时时间
乐观锁
乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测
乐观锁实现流程:
我们在更新之前,先查询一下库存表中当前库存数(quantity),然后在做update的时候,以库存数作为一个修改条件。
当我们提交更新的时候,判断数据库表对应记录的当前库存数与第一次取出来的库存数进行比对,如果数据库表当前库存数与第一次取出来的库存数相等,则予以更新,否则认为是过期数据。
悲观锁
当我们要对数据库的一条数据进行修改时,为了避免同时被其他人修改,最好的办法就是对该数据进行加锁以防止并发.这种借助数据库锁机制,在修改数据之前先锁定,再修改的方式被称为悲观锁
悲观锁实现流程:
- 在对记录进行修改之前,先尝试对记录加上排它锁
- 如果加锁失败,说明该记录正在被修改,那么当前查询等待或抛异常
- 如果成功加锁,那么就可以对记录做修改,事务完成后就会解锁了
- 期间如果有其他对该记录的修改或加锁的操作,都会等待我们解锁或直接抛出异常
悲观锁包含共享锁和排它锁
-
共享锁
共享锁又称读锁,多个事务对于同一数据可以共享一把锁,都能访问到该数据,但是只能读不能修改
-
排它锁
排它锁又称写锁,排它锁就是不能与其他锁并存,一个事务获取了一个数据行的排它锁,那么其他事务就不能再获取该行的其他锁,包括共享锁和排它锁,但是获取排它锁的事务可以对数据行读取和修改
来源:https://www.cnblogs.com/abysschen/p/12527032.html