Finology 大数据金融

通过大数据以量化金融

MySQL 事务隔离相关命令如下:

1
2
3
4
5
6
7
8
9
10
11
-- 查看当前会话隔离级别
SELECT @@tx_isolation;

-- 查看系统隔离级别
SELECT @@global.tx_isolation;

-- 0. SERIALIZABLE
-- 1. REPEATABLE READ
-- 2. READ COMMITTED
-- 3. READ UNCOMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

MySQL 默认的隔离级别是 RR, Repeatable Read。

Java 程序中,我们使用 MyBatis ORM 框架和 MySQL 交互。MySQL 有个 user 表,所以在 Java 程序我们需要有个 User 类。

我给 User 类添加了 @Data@Builder 注解,结果在做 select 操作时报错了,MyBatis 应该是说需要一个无参构造器。

@Data 注解会默认生成 getter/setter,和无参构造方法,但是当我们添加了 @Builder 注解时,无参构造器就被删除掉了,所以报错了。

这时我们会想到那我再加一个 @NoArgsConstructor 注解行不行呢,实验后发现是不行的。

@NoArgsConstructor@Builder 会有冲突,导致编译出错。

可以添加一个无参构造方法并加上@Tolerate注解,如下:

1
2
3
4
5
6
7
8
@Data
@Builder
public class User {

@Tolerate
public User() {
}
}

或者,类似这种和MySQL表结构对应的Entity类,就不使用 @Builder 注解,需要User实例时,就 new 一个吧。

Java 开发实践中,我们在处理时间、时区上总是搞得很乱。这里总结一下认为比较好的一个最佳实践,欢迎大家提出自己的意见。

Java 中不带时区的类 java.time.LocalDateTime,这个类对应 MySQL 中 datetime 类型。MySQL 中的 datetime 类型也是不带时区概念的。

不带时区概念的意思就是说,当我看到这个值的时候,并不能唯一确定时间,因为没有时区信息。

但 Java 中的类 java.util.Datejava.time.ZonedDateTime 却是带了时区的类,这个值,是能唯一确定时间的。

我们在中国开发应用程序时,最佳解决方案:

  1. Java, MySQL 所在服务器时间设置为东八区时间。

  2. Java, MySQL 默认使用服务器时区。

  3. java connector 6 版本以后,MySQL 连接字符串指定东八区,不指定是默认西五区的美国东部时间。

  4. 前端拿到东八区时间后,根据浏览器时区做相应的调整。前端提交表单时,拿到当地时间后,转换成东八区时间提交。

0%