【发布时间】:2022-01-10 14:48:21
【问题描述】:
我必须通过java代码将数据一一插入到两个表department和employee中。每张表都有一个公共列dept_id,它是department表中的primary key和employee表中的foreign key,引用department表的dept_id列。在部门表中的 dept_id 上定义了一个序列 dept_sequence。
现在,我目前将数据插入这两个表的方法如下,
我分别使用 dept_sequence.nextval 和 dept_sequence.currval 作为 dept_id 列将数据插入到这两个表中。
Map<String, Object> deptData = ImmutableMap.builder()
.put("DEPT_NAME", "TEXTILE")
.put("LOCATION", "PARIS")
.build();
String insertToDeptSql = "INSERT INTO DEPARTMENT(DEPT_ID, DEPT_NAME, LOCATION)
VALUES(dept_sequence.nextval, :DEPT_NAME, :LOCATION)";
namedParameterJdbcTemplate.update(insertToDeptSql , deptData);
Map<String, Object> empData = ImmutableMap.builder()
.put("EMP_NAME", "John")
.put("AGE", 15)
.build();
String insertToEmpSql = "INSERT INTO EMPLOYEE(EMP_ID, DEPT_ID, EMP_NAME, AGE)
VALUES(emp_sequence.nextval, dept_sequence.currval, :EMP_NAME, :AGE)";
namedParameterJdbcTemplate.update(insertToEmpSql, empData);
当一次只有一个事务时,它工作得非常好。这两个表都有正确的 dept_id 值,但它在多事务环境中中断。员工表没有收到相同的 dept_sequence 值,该值插入到部门表中以进行一项事务。在将记录插入员工表之前,dept_sequence 值会通过不同的事务(将新记录插入部门表)增加,这可能发生在不同的系统中,并且员工表会收到一些增加的序列值。
我们如何实现这一点,使同一事务的两个表中的 dept_id 值保持相同。
注意:实际数据模型不同,员工和部门仅用于示例目的,因此不要建议对模型和主键、外键约束进行任何更改,因为我不允许对实际模型做任何事情。
【问题讨论】:
-
只标记您使用的数据库。
-
@forpas 使用 oracle...进行了更正
标签: java sql oracle spring-boot