锁是数据库系统区别于文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问。
实际操作数据库时,数据库会自动为操作的数据添加合适的锁。
乐观锁和悲观锁
悲观锁是依赖于数据库存储引擎的锁机制实现的并发控制手段:
乐观锁其实是跟锁机制无关的并发控制手段:乐观锁假设各个事务处理数据时不会相互影响,各个事务在提交数据更新前会检查是否有别的事务修改了数据,如果有则发生回滚,具体实现是在表中添加一个版本号字段,加入A,B两个事务对某一行进行更新操作,两个事务读到的版本号都是1,A事务先提交,提交后版本号变为2,B事务提交前查到的版本号为2自己取得的版本号为1则更新失败。
事务的隔离级别中可重复读就是用乐观锁实现的。
事务隔离级别:读未提交,读已提交,可重复读,序列化。
隔离级别要解决的问题就是三个:脏读,不可重复读,幻读。
脏读和不可重复读很好理解,一个是因为当前事务读了另一个事务开启前和提交前的数据,另一个是当前事务读了另一个事务开启前和提交后的数据。
幻读和不可重复读表现一样,只是产生的原因不一样,因此解决的方法也不一样。幻读是当前事务读取了另一个事务开启前和更新或删除操作提交后的数据产生的,用乐观锁也叫多版本并发控制来解决。给表加一个版本号的字段,每次修改数据版本号改变,读取相同的版本号解决。而幻读是因为插入数据导致的,解决方式是序列化。让事务依次执行。