悲观锁和乐观锁
1.数据库并发 当多个用户修改数据库中同一个数据时,需要对用户的访问进行并发管理,不然不会出现数据更新丢失,数据脏读等错误;比如线程A和B从数据库中读取同一数据为1,线程A先修改1为10,线程B接着又将数据修改成1,那么A的修改丢失;故需要数据库对数据加锁以实现并发管理 2.悲观锁 主观上认为数据一定会修改,对访问的数据加锁,在释放锁之前,其他事务都不能访问该数据,比如goods表,查询所有name=“math”的记录,select * from goods where name = “math” for update ,对查询出来的记录加锁,其他悲观锁事务均不能读写这些记录,但是select * from goods where name = “math”可以读数据;悲观锁一般由数据库锁机制实现;悲观锁的锁粒度默认是基于Row-level (表的id明确的情况下),如果id不明确,则使用Tabel-level。 注:使用悲观锁会,数据库不会默认提交更新,不能使用autocommit,开启事务,完成持久化操作后,需要手动提交事务,commint(); 3.乐观锁 主观上认为数据不会被修改,但是在提交更新数据时会检测冲突与否,如果冲突,返回用户错误信息,让用户决定接下来怎么做;检测方法有两种:一、数据版本控制机制,就是在数据库表中添加一个version字段