什么是悲观锁:
- 悲观锁就是在操作数据时,认为此操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作,因此悲观锁需要耗费较多的时间。
- 悲观锁是由数据库自己实现了的,要用的时候,我们直接调用数据库的相关语句就可以了。
悲观锁的类型:
- 共享锁(shared lock, 记为S):读锁。如果事务T获得了数据对象Q的共享锁,则事务T可读Q但不能写Q
- 排它锁(eXclusive lock, 记为X):写锁。如果事务T获得了数据对象Q上的排它锁,则事务T既可读Q又可写Q
- 共享锁与共享锁相容:当事务A获取数据a的共享锁时,其它事务也可以同时获取数据a的共享锁,但是不能获取数据a的排它锁
- 排它锁与共享锁、排它锁与排它锁是不相容的:当事务A获取数据a的排它锁时,其它事务不能获取数据a的任何锁,必须等事务A释放排它锁之后,才能获取
悲观锁的申请和释放操作:
- SL(Q)或Slock(Q)——申请数据对象Q上的共享锁
- XL(Q)或Xlock(Q)——申请数据对象Q上的排它锁
- UL(Q)或Unlock(Q)——释放数据对象Q上的锁
MySQL默认加悲观锁机制:
- 对于普通SELECT语句,InnoDB不会加任何锁
- 对于DELETE、UPDATE、INSERT,会自动的对涉及的行或表加X锁