0%

jpa锁

文章字数:331,阅读全文大约需要1分钟

对数据库进行操作的时候有时需要加锁,数据库操作往往是线程操作的重合部分。jpa提供了对于数据库锁的支持

@Version

jpa提供的乐观锁,指定实体的字段/属性作为乐观锁的version。每次insertupdate操作都会带上version,进行CAS操作。

  • 字段支持类型:int, Integer, short, Short, long, Long, java.sql.Timestamp
  • 失败会抛出异常org.springframework.orm.ObjectOptimisticLockingFailureException
    需要自己处理异常
  • 具体代码
1
2
3
4
5
6
7
8
9
10
public class user{
@Column
private String name;

/**
* 乐观锁version
*/
@Version
private Integer version;
}

@Lock

  • @Lock注解只有一个value的属性,是LockModeType的枚举类型
1
2
3
4
public interface AccountRepository extends JpaRepositoryImplementation<Account,Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
Account findByAccountName(String accountName);
}

锁类型

  1. LockModeType.Optimistic乐观锁,默认的锁类型。事务提交时检查版本
  2. LockModeType.OPTIMISTIC_FORCE_INCREMENT乐观锁,无论实体有没有改变都会累加版本。(这样保证读也是原子性的)
  3. LockModeType.PESSIMISTIC_READ悲观锁,当事务锁住实体时禁止再次写入。允许其他事务使用PESSIMISTIC_READ加锁
  4. LockModeType.PESSIMISTIC_WRITE悲观锁,READ的增强版,数据库禁止读取。
  5. LockModeType.PESSIMISTIC_FORCE_INCREMENT:悲观锁+乐观锁,乐观锁获取和比对之间如果有悲观锁加了锁,因为悲观锁不能更改版本号,所以无法阻止乐观锁覆盖其事务。此锁就是会增加版本号的悲观锁。