由于并发的存在,当多个线程同时对数据库的同一数据进行删改查操作时,数据可能会不准确,因此数据库会有行级锁的概念。
数据库的行级锁就是采用一种独占的方式,只要当前有一个线程操作这条数据,那么其他线程对该数据只有查询的能力,没有修改的权利,因此行级锁具有排他性,这样保证了数据的一致性和安全性。
数据库中执行 select * from table where id=? for update,就会执行行级锁,但是需要注意,只有指定查询条件的主键,才会执行行级锁,否则就是表锁了,例如 select * from table where othercum=? for update
在开发设计中,行级锁映射到应用程序的开发环境中,就是悲观锁和乐观锁的概念。
悲观锁:在应用程序中显示地为数据资源加锁.悲观锁假定当前事务操纵数据资源时,肯定还会有其它事务同时访问该数据资源,为了避免当前事务的操作受到干扰,先锁定资源.尽管悲观锁能防止丢失更新和不可重复读这类并发问题,但会影响并发性能.(简单理解,就是每次在操作数据时总是悲观地认为会有别的事务也会来操纵同一数据,因此锁住该笔数据,直到自己操作完成后再解除锁)
乐观锁:假定当前事务操纵数据资源时,不会有其它事务同时访问该数据资源,因此完全依靠数据库的隔离级别来自动管理锁的工作.应用程序采用版本控制手段来避免可能出现的并发问题.(所谓乐观锁,它通常认为多个事务同时操纵同一数据的情况是很少的,因此根本不做数据库层次上的锁定,只是基于数据的版本标识实现应用程序级别上的锁定机制,既保证了多个事务的并发访问,又有效地防止了丢失更新的出现)
jpa的Lock的注解。并且要加上LockModeType.PESSIMISTIC_WRITE ,这个就相当于for update了。此注解为悲观锁的具体应用。