Repeatable Read(可重读)MySQL中InnoDB默认的隔离级别。
悲观锁
为了防止并发导致数据库操作受其他线程操作数据库影响,一般基于数据库的悲观锁来加锁操作。
从sql语句来看,为了抢占独占锁,两种方式。
1、更新语句加锁
begin;开启事务 insert into a... update a set .. delete from a... commit; 提交事务 |
2、查询语句加锁
begin;开启事务 select .. from a where .. for update commit; 提交事务 |
从性能来看,这两种悲观锁会因为高并发而导致竞争激烈,性能较差。
乐观锁
update a set ... where id = 1; Rows matched: 1 Changed: 0 Warnings: 0 |
先假设没有同时抢占资源,等更新后查看结果是否符合假设的预期。从Changed: 0来看说明不符合预期。
乐观锁对于出现的这种场景,就需要重试来解决,这也是乐观锁的缺点。