【发布时间】:2019-09-06 04:45:38
【问题描述】:
我有以下架构。
Person(pid, pname)
Beer(bid, bname)
Likes(pid,bid)
我想插入一个喜欢的项目。但是,我接受新用户的以下格式:(Pid, pname, bid, bname)。
我想为此创建一个事务以避免冲突(这是我真正问题的高度简化版本,但问题是相同的)。在我的 Person 表中,我设置了 pid Auto-Increment(或 Postgresql 中的 Serial)。 bid 也是如此。
我陷入了一个我知道 Person 不存在但啤酒存在的点。所以,我必须创建一个 Person,然后将一个实体添加到 Likes 关系中。
据我所知,当我使用以 dB 为单位的 Autocommit(false) 时,事务在提交之前不会保存。那么,我是否应该更改数据库设计:
- 将自动递增字段更改为普通整数,而不是空字段。
- 在事务中,autoCommit(false) 开始后,读取人员的最后一个条目
- 在创建新人物时将其加一
- 然后创建点赞关系
或者,有没有其他的方法或者我错过了一些关于交易的东西?
这是我到目前为止所做的:
try {
String add_person_sql = "INSERT INTO Person (name) VALUES(?)";
PreparedStatement add_person_statement = mydb.prepareStatement(add_person_sql);
String add_likes_sql = "INSERT INTO Likes (pid, bid) VALUES(?, ?)";
PreparedStatement add_likes_statement = mydb.prepareStatement(add_likes_sql);
mydb.setAutoCommit(false);
add_person_statement.setString(1, pname);
// The problem is, without saving the person I cannot know the id of the person
// AFAIK, this execution is not finished until commit occurs
add_person_statement.executeQuery();
// How can I fetch person's id
add_likes_statement.setString(1, pid);
add_likes_statement.setString(2, bid);
add_likes_statement.executeQuery();
mydb.commit();
}
catch(Exception e){
System.out.println(e);
mydb.rollback();
}
【问题讨论】:
-
"在创建新人时将其增加一" 这样做不这样做。它很慢,更糟糕的是,它无法正常工作。
标签: postgresql jdbc transactions