文章字数:331,阅读全文大约需要1分钟
对数据库进行操作的时候有时需要加锁,数据库操作往往是线程操作的重合部分。
jpa
提供了对于数据库锁的支持
@Version
jpa
提供的乐观锁,指定实体的字段/属性作为乐观锁的version
。每次insert
和update
操作都会带上version
,进行CAS
操作。
- 字段支持类型:int, Integer, short, Short, long, Long, java.sql.Timestamp
- 失败会抛出异常
org.springframework.orm.ObjectOptimisticLockingFailureException
需要自己处理异常 - 具体代码
1 | public class user{ |
@Lock
@Lock
注解只有一个value
的属性,是LockModeType
的枚举类型
1 | public interface AccountRepository extends JpaRepositoryImplementation<Account,Long> { |
锁类型
LockModeType.Optimistic
乐观锁,默认的锁类型。事务提交时检查版本LockModeType.OPTIMISTIC_FORCE_INCREMENT
乐观锁,无论实体有没有改变都会累加版本。(这样保证读也是原子性的)LockModeType.PESSIMISTIC_READ
悲观锁,当事务锁住实体时禁止再次写入。允许其他事务使用PESSIMISTIC_READ
加锁LockModeType.PESSIMISTIC_WRITE
悲观锁,READ
的增强版,数据库禁止读取。LockModeType.PESSIMISTIC_FORCE_INCREMENT
:悲观锁+乐观锁,乐观锁获取和比对之间如果有悲观锁加了锁,因为悲观锁不能更改版本号,所以无法阻止乐观锁覆盖其事务。此锁就是会增加版本号的悲观锁。