行级锁
行级锁一般是指排它锁,即被锁定行不可进行修改,删除,只可以被其他会话select。
访问数据库的时候 针对整个行数据
自动加锁。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁;对于普通SELECT语句,不会加任何锁。
优缺点
1.优点:
- 由于锁粒度小,争用率低,并发高。(也就是可以大大减少数据库操作的冲突)
2.缺点:
- 实现复杂,开销大。
- 加锁慢、容易出现死锁。
表级锁
表级锁,一般是指表结构共享锁,是不可对该表执行DDL操作,但对DML操作都不限制。
访问数据库的时候 针对整个表数据
自动加锁。查询操作(SELECT),会自动给涉及的所有表加读锁,更新操作(UPDATE、DELETE、INSERT),会自动
给涉及的表加写锁。
优缺点
1.优点:
- 开销小,加锁快,不会出现死锁。
2.缺点:
- 锁的粒度大,发生锁冲突的概率高,并发度低。
悲观锁(加的是表级锁)
一方:查询语句加 for update;另一方:查询语句加 for update;当进行更新语句的时候,另一方不能进行更新操作
乐观锁
更新语句设置版本号,在指定版本中更新数据
一方:update account set money=money-200,version=version+1 where id=1 and version=0;
另一方操作同一个版本号,则不能更新数据
另一方:update account set money=money+200,version=version+1 where id=1 and version=0;
如果更新多,查询少,用悲观锁;反之,乐观锁