自动填充
创建时间、修改时间!这些这个操作自编都是自动化实现的,我们不希望手动更新!
阿里巴巴开发手册:所有的数据库表:gmt_create\gmt_modilfed几乎所有的表都要配置上!而且自动化!
方法一:数据库级别
1.在表中新增字段create_time\update_time
dateTime类型
自动生成
方法二:代码级别
1.删除数据库的默认值
2.实体类上增加相应的注解- @TableField(fill = FieldFill.INSERT)
- private Long createUser;
- @TableField(fill = FieldFill.INSERT_UPDATE)
- private Long updateUser;
复制代码 3.处理注解,编写处理器
4.测试插入
5.测试更新
乐观锁
在面试过程中,经常被问到乐观锁------悲观锁(原子引用)
认为不会出现问题,无论干什么不去上锁,如果出现了问题,就再次更新值测试
version、new version
悲观锁,认为都会出现问题,无论干什么都会上锁
乐观锁的实现
- 取出记录
- 更新时,带上version
- 执行更新操作时,set version = newVersion where version = oldVersion()
- 如果version不对,就更新失败
- 乐观锁:1.先查询,获得版本号 version=1
- --A
- update user set name ="郝泾钊",version=version+1
- where id =2 and version =1
- --B 线程抢先完成 这时候 version=2,就会导致A修改失败
- update user set name ="郝泾钊",version=version+1
- where id =2 and version =1
复制代码 Mybatis Plus 的乐观锁字段
1.增加version字段,默认值为1
2.实体类加上version字段- //添加version注解
- @Version
- private Integer version;
复制代码 3.注册组件
要添加@Configuration注解- //注册乐观锁的插件
- @Bean
- public MybatisPlusInterceptor mybatisPlusInterceptor() {
- MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
- interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
- return interceptor;
- }
复制代码- package com.ithema.reggie.config;
- import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
- import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
- import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
- import org.mybatis.spring.annotation.MapperScan;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.transaction.annotation.EnableTransactionManagement;
- /**
- * 配置MP的分页插件
- */
- @MapperScan("com.ithema.reggie.mapper")
- @EnableTransactionManagement
- @Configuration
- public class MybatisPlusConfig {
- @Bean
- public MybatisPlusInterceptor mybatisPlusInterceptor(){
- MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
- mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
- return mybatisPlusInterceptor;
- }
- }
复制代码 4.测试乐观锁- @Test
- public void OptimisticLockerInnerInterceptor(){
- //1.查询用户信息
- User us = userMapper.selectById("1L");
- //修改用户质量
- us.setName("郝泾钊");
- us.setAge("20");
-
- //并发插队
- User us = userMapper.selectById("1L");
- //修改用户质量
- us.setName("郝泾钊");
- us.setAge("20");
- //执行更新操作
- userMapper.updateById(us);
- //执行更新操作
- //自旋锁自己就能行了
- userMapper.updateById(us);
- }
复制代码 分布式系统唯一id
雪花算法:
snowflake算法
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。
其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号,最后还有一个符号位,永远是0。
这个算法单机每秒内理论上最多可以生成1000*(2^12),也就是409.6万个ID。
在这里插入图片描述
雪花算法描述:- 最高位是符号位,始终为0,不可用。
- 41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。
- 10位的机器标识,10位的长度最多支持部署1024个节点。10位器标识符一般是5位IDC+5位machine编号,唯一确定一台机器。
- 12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。
复制代码 snowflake算法可以根据自身项目的需要进行一定的修改。比如估算未来的数据中心个数,每个数据中心的机器数以及统一毫秒可以能的并发数来调整在算法中所需要的bit数。
优点:
1)不依赖于数据库,速度快,性能高。
2)ID按照时间在单机上是递增的。
3)可以根据实际情况调整各各位段,方便灵活。
缺点:
1)在单机上是递增的,由于涉及到分布式环境,每台机器上的时钟不可能完全同步,有时也会出现不是全局递增的情况。
2)只能趋势递增。(如果绝对递增,竞对中午下单,第二天再下单即可大概判断该公司的订单量,危险!)
3)依赖机器时间,如果发生回拨会导致可能生成id重复。
算法的java实现:
public class SnowflakeIdWorker {
/** 开始时间截 (2015-01-01) */
private final long twepoch = 1420041600000L;
[code]/** 机器id所占的位数 */private final long workerIdBits = 5L;/** 数据标识id所占的位数 */private final long datacenterIdBits = 5L;/** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */private final long maxWorkerId = -1L ^ (-1L |