spring data jpa基于版本号与时间戳的乐观锁

spring data jpa基于版本号与时间戳的乐观锁

基于时间戳

  • 创建表
CREATE TABLE `test_optimistic_lock_timestamp` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(60) NOT NULL,
  `info` VARCHAR(100) DEFAULT NULL,
  `last_modify` TIMESTAMP(3) NOT NULL DEFAULT "2000-01-01 00:00:00.000" ON UPDATE CURRENT_TIMESTAMP(3),
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4
  • Entity与Repository
@Entity
@Table(name = "test_optimistic_lock_timestamp")
public class TestOptimisticLockTimestamp {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;
    private String name;
    private String info;

    @Version
    //@Source(SourceType.DB) //从db获取时间没有毫秒,痛苦
    private Timestamp lastModify;
}
@Repository
public interface TestOptimisticLockVersionRepository extends JpaRepository<TestOptimisticLockVersion,Long> {

}
  • 测试 repository.save(entity); 需要注意的是,@Source(SourceType.DB)是注释的,如果没有注释,默认从数据库取时间,但是只能到秒,注意上面建表语句,lastModify是到毫秒的,一般来说,毫秒级已经可以防止绝大多数的并发冲突了,但秒级不行。当然也可以到微秒。期望的效果肯定是从数据库获取毫秒数,这样就有一个统一的标准。另外@Source不是JPA注解。

使用一个Integer值做并发控制是比较合适的,使用时间戳的效率稍微差一些,但是,相比int值,时间戳增加了一个在业务上更合理的字段,也有意义,我们并不想每个实体都加一个Version,但是大部分实体都有lastModify