我目前正在使用一些遗留代码来手动滚动交易。 请考虑以下内容(示例仅用于说明目的,忽略语法/设计问题):
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
private PlatformTransactionManager transactionManager;
private DefaultTransactionDefinition txDefRequired = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED);
private DefaultTransactionDefinition txDefRequiresNew new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
void createPosts(Map<String, String> posts){
TransactionStatus status = transactionManager.getTransaction(txDefRequiresNew)
try {
// posts Map is made up for username:posttext key pair
for (Map.Entry<String, String> entry : posts.entrySet()) {
// Construct online post
createPost(entry.getKey(), entry.getValue());
}
transactionManager.commit(status);
} finally {
if (!status.isCompleted()) {
transactionManager.rollback(status);
}
}
}
void createPost(String username, String text){
TransactionStatus status = transactionManager.getTransaction(txDefRequired)
// Construct online post
OnlinePost p = new OnlinePost(text);
User u = resolveUser(username);
p.setUser(u);
transactionManager.commit(status); // flush the session
}
User resolveUser(String username){
TransactionStatus status = transactionManager.getTransaction(txDefRequired)
User u = getUser(username);
if(u == null)
createUser(username);
return u;
transactionManager.commit(status); // flush the session
}
在这个特定的流程中, tx.commit()在被调用的方法中,例如 resolveUser(),只会用于刷新是否正确会话(flush-mode = auto)并返回一个新的持久化实体,其中生成并分配了一个人工主键,以便您以后可以在同一个事务中使用它?
答案 0 :(得分:1)
没有。提交将始终结束工作单元并将更新推送到数据库。另一方面,刷新不会将更改提交到db(就像提交它们一样,以便每个人都可以看到)。你可以在技术上回滚一个刷新的变化。 https://stackoverflow.com/a/14626510/2231632可能重复。
使用人工主键你需要的是什么,你可以使用Session.flush。但是如果要在同一个txn中使用该密钥,请不要提交txn。