乐观锁和悲观锁一般是在并发的时候使用。
比如多个线程同时对一条数据进行更新可能就会出现所谓的并发问题。
问题1
脏读:一个事务的更新覆盖了其它事务的更新结果
问题2
更新丢失:一个事务读取其它完成一半事务的记录时,就会发生脏读
乐观锁
比较乐观的态度,认为每次都不会有其他线程同时操作一条数据,只是在最后提交事务的时候校验一下是否有其他线程有过事务操作。所以乐观锁不能解决脏读的问题。乐观锁一般是在读多写少的情况下使用。一般使用版本号或时间戳来实现,在表中加一个字段版本号或时间戳,先查出来记录,在更新的时候将查出来的记录作为条件,同时把版本号或者时间戳赋一个新的值。最后通过影响的行数来判断结果。
悲观锁
比较悲观的态度,认为每次都会有其他线程同时操作一条数据,悲观锁屏蔽一切可能违反数据完整性的操作。java的Synchronize关键字就是一种悲观锁的实现