在 Spring Boot 中使用乐观锁

本文简单的演示了在 Spring Boot 中使用乐观锁(Optimistic Lock)情况。

启动乐观锁

在 Spring Boot Data JPA 中,默认是启动了乐观锁机制的,我们需要做的就是在实体中定义这把”锁”。最简单的定义说的方式是在实体类中添加一个(长)整型或是时间戳的属性,并用@version注解它。

如下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class Account {

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@ApiModelProperty(notes = "唯一编码,有系统自动生成")
private Integer id;

@Version
private Long version;

@NotNull
private String mobile;

private String nickName;

private Double balance;
}

对应的Repository不用修改,保存默认的写法即可。

验证

但执行一个新增操作时:

1
accountRepository.save(account);

可以看到后台会生成如下的SQL语句:

1
insert into account (balance, mobile, nick_name, version, id) values (?, ?, ?, ?, ?)

查询数据库,可以得知应用为 version 自动生成了值: 0。

在别的业务中改变 Account 对象,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Optional<Account> opAccount = accountRepository.findById(accountId);
if (opAccount.isPresent()) {
Account account = opAccount.get();
account.setBalance(account.getBalance() + amount);

TradeHist hist = new TradeHist();
hist.setAccountId(accountId);
hist.setCurrDate(new Date());
hist.setType(0);
hist.setAccId(123456789);
hist.setAmount(amount);

tradeHistRepository.save(hist);
}

可以看到后台会生成如下的SQL语句:

1
2
3
select account0_.id as id1_0_0_, account0_.balance as balance2_0_0_, account0_.mobile as mobile3_0_0_, account0_.nick_name as nick_nam4_0_0_, account0_.version as version5_0_0_ from account account0_ where account0_.id=?
insert into trade_hist (acc_id, account_id, amount, curr_date, note, type, version, id) values (?, ?, ?, ?, ?, ?, ?, ?)
update account set balance=?, mobile=?, nick_name=?, version=? where id=? and version=?

可以看到,系统使用字段 version 进行了版本检查。

本文标题:在 Spring Boot 中使用乐观锁

文章作者:梅老师

发布时间:2019年12月15日 - 07:12

最后更新:2020年09月16日 - 08:09

原始链接:https://www.mls-tech.info/java/springboot-jpa-optimistic-locking/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。