读锁:LOCK in SHARE MODE 写锁:for UPDATE
行锁 (锁住某行数据)
SELECT name FROM t_goods_info where code = 'huawei' for UPDATE;
页锁 (锁住某些数据)
SELECT NAME FROM t_goods_info where code in ('huawei','xiaomi') for UPDATE;
表锁 (锁住整张表)
select name from t_goods_info for update
----------------------------------------------------------------
读锁能够对读请求共享,写锁具有排他性。
(1)当我们对一行数据开启事务后加读锁,我们还能再次加读锁;若是加写锁就会因为锁占用而出现等待,只有事务commit后才能加锁。
(2) 我们对一行数据加写锁后,只有事务commit后才能加其他锁(读锁/写锁)。
死锁:
T1: select * from table (加共享锁)
update table set column1='hello'
T2: select * from table (加共享锁)
update table set column1='hello'
运行过程: T1 select完就发生了死锁,程序停止了。
原理:T1先到达执行select加共享锁,然后T2执行select加共享锁;
T1 select执行完之后准备update,此时T2木有释放锁,所以
T1无法执行,这样T1没有执行完,T2也无法执行。
乐观锁和悲观锁: