乐观锁和悲观锁。
悲观锁:具有很强的排他性和排他特性。是指外界对数据修改的保守态度(包括系统当前的其他事务和来自外部系统的事务)。因此,在整个数据处理过程中,数据是被锁定的。悲观锁的实现往往依赖于数据库提供的锁机制(只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则即使在这个系统中实现了锁机制,也不能保证外部系统不会修改数据)。
之所以叫悲观锁,是因为它是一种对数据修改持悲观态度的并发控制方法。总是假设最坏的情况。每次读取数据时,您默认其他线程会更改数据,因此您需要锁定它。当其他线程想要访问数据时,您需要阻塞并挂起它。悲观锁的实现:
1.传统的关系数据库使用这种锁定机制,如行锁、表锁、读锁、写锁等。所有这些都在操作前锁定。
2.同步关键字在Java中的实现。
悲观锁主要分为共享锁和排他锁:
共享锁[共享锁]也称为读锁,简称S锁。顾名思义,共享锁是指多个事务可以共享同一个数据的锁,所有事务都可以访问数据,但只能读取,不能修改。
排它锁[排它锁]也叫写锁,简称X锁。顾名思义,排他锁不能和其他锁共存。如果一个事务获得了一个数据行的排他锁,那么其他事务就不能获得该行的其他锁,包括共享锁和排他锁。获取的排他锁事务可以读取和修改数据行。
乐观锁定:乐观锁定是一种相对悲观的锁定。乐观锁定假设数据的一般情况不会引起冲突,因此在数据提交更新时,会正式检查数据是否存在冲突。如果是冲突的,它会向用户返回异常信息,让用户决定怎么做。乐观锁定适合读多写少的场景,可以提高程序的吞吐量。乐观锁定采用了更宽松的锁定机制。也是避免因数据库假象和业务处理时间过长而导致数据处理错误的机制。但是乐观锁定不会刻意使用数据库本身的锁定机制,而是根据数据本身来保证数据的正确性。乐观锁定的实现:
1.CAS实现:java中java.util.concurrent.atomic包下的原子变量使用乐观锁定的CAS实现方法。
2.版本号控制:通常,数据版本号版本字段被添加到数据表中,以指示数据被修改的次数。当数据被修改时,版本值将为1。当线程A想要更新数据时,也会在读取数据的同时读取版本值。提交更新时,如果刚刚读取的版本值等于当前数据库中的版本值,则在更新成功之前不会更新。
3.乐观并发控制认为事务之间数据竞争的概率比较小,所以尽量直接做,一直锁到提交,这样就不会出现锁或者死锁的情况。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/146470.html