“插入事务该如何控制”这个问题可以从数据库事务机制和代码层面控制两个角度来回答。下面以常见的关系型数据库(MySQL / PostgreSQL / Oracle)和主流编程语言为例说明。
插入(INSERT)操作通常用事务保证:
BEGIN;
INSERT INTO user (name, age) VALUES ('Alice', 20);
INSERT INTO user_log (user_id, action) VALUES (LAST_INSERT_ID(), 'create');
COMMIT;
-- 若出错
-- ROLLBACK;
BEGIN;
INSERT INTO orders (user_id, amount) VALUES (1, 100);
-- 假设此处发生错误
INSERT INTO order_item (order_id, item) VALUES (999, 'error');
COMMIT;
如果第二条失败,应执行:
ROLLBACK;
Connection conn = dataSource.getConnection();
try {
conn.setAutoCommit(false);
PreparedStatement ps1 = conn.prepareStatement(
"INSERT INTO user(name) VALUES(?)");
ps1.setString(1, "Tom");
ps1.executeUpdate();
PreparedStatement ps2 = conn.prepareStatement(
"INSERT INTO user_log(user_id, action) VALUES(?, ?)");
ps2.setInt(1, 1);
ps2.setString(2, "insert");
ps2.executeUpdate();
conn.commit();
} catch (Exception e) {
conn.rollback();
} finally {
conn.close();
}
@Transactional
public void createUser() {
userMapper.insert(user);
userLogMapper.insert(log);
}
@Transactional(rollbackFor = Exception.class)
SqlSession session = sqlSessionFactory.openSession(false);
try {
session.insert("insertUser", user);
session.insert("insertLog", log);
session.commit();
} catch (Exception e) {
session.rollback();
} finally {
session.close();
}
with session.begin():
session.add(User(name="Alice"))
session.add(UserLog(action="create"))
异常自动回滚。
@Transactional
public void batchInsert(List<User> users) {
for (User u : users) {
userMapper.insert(u);
}
}
⚠️ 注意:
conn.setAutoCommit(false);
| 场景 | 推荐方式 |
|---|---|
| 简单 SQL | BEGIN / COMMIT / ROLLBACK |
| Java 项目 | Spring @Transactional |
| 高性能批量 | 分批提交 + 事务 |
| 多表关联插入 | 一个事务内完成 |
如果你能告诉我使用什么数据库 / 框架 / 语言,我可以给你更精确的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。