悲观锁:在数据处理时将数据上锁,直到执行完释放锁,在此期间其他操作会block。
乐观锁(CAS):用原值和期望值比较,如果一致,则替换成新值。常用机制有:版本号控制和时间戳。用类实现乐观锁,基础类型会引起(A-B-A)。
锁机制
- Read uncommitted --不推荐
会读取未提交的事务,引起脏读 - Read committed --解决脏读
只会读取提交的事务,解决了脏读;但同一个事务里的两次读取同一行数据,如果有其他事务修改了这行的数据内容,那么两次读取内容就会不一样,引起不可重复读 - Repeatable read(mysql默认)–解决脏读、不可重复读(行级锁)
对读取的数据加上行级锁,其他事务不能更改当前行数据,解决了不可重复读;但是,如果其他事务不是修改数据,而是添加了一行数据,就会导致同一个事务里的两次读取数据会不一致(多了数据),引起幻读 - serializable --解决脏读、不可重复读、幻读(表锁)
加入了表锁,解决以上所有问题,但是效率低