悲观锁
读锁/共享锁(少用)
读锁可被其他线程所共享,所有线程都可以读取到数据
打开一个cmd窗口,连接数据库,开启事务, 使用读锁(lock in share mode)查询表,不提交事务
此时 该表加上了读锁
新打开一个cmd窗口,连接相同数据库,开启事务,查询相同的表
此时 该表的读锁被第二个窗口的查询语句取走 第一个查询语句的锁已不在
尝试在第一个窗口update数据 无法执行成功 会一直等待直到超时
将第二个窗口的事务提交后锁消失 此时再次在第一个窗口执行更行语句 执行成功;
写锁/排他锁(用的多)
写锁不能共享,只要有人为数据加入了写锁,其他人就不能为数据加任何锁
在第一个窗中开启事务 使用写锁查询表 不提交事务
在第二个窗口开启事务 使用写锁查询表 不会执行成功 直至等待超时
锁并没有移交到第二个查询窗口
此时 将第一个窗口的事务提交,再次再第二个窗口执行更新语句 执行成功
注:
给表添加写锁,其他线程无法读取这个锁,当加锁事务提交后才能读取该表;所以一般都会锁行 锁行后该行无法加锁 无法更新