温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

插入事务该如何控制

发布时间:2026-09-01 21:56:43 来源:亿速云 阅读:92 作者:小樊 栏目:数据库

“插入事务该如何控制”这个问题可以从数据库事务机制和代码层面控制两个角度来回答。下面以常见的关系型数据库(MySQL / PostgreSQL / Oracle)和主流编程语言为例说明。


一、事务控制的基本原则

插入(INSERT)操作通常用事务保证:

  • 原子性(Atomicity):要么全部插入成功,要么全部回滚
  • 一致性(Consistency):插入后数据满足约束
  • 隔离性(Isolation):并发插入互不干扰
  • 持久性(Durability):提交后数据不丢失

二、SQL 层面的事务控制(通用写法)

1. 手动控制事务(最标准)

BEGIN;

INSERT INTO user (name, age) VALUES ('Alice', 20);
INSERT INTO user_log (user_id, action) VALUES (LAST_INSERT_ID(), 'create');

COMMIT;
-- 若出错
-- ROLLBACK;

2. 异常处理中回滚

BEGIN;

INSERT INTO orders (user_id, amount) VALUES (1, 100);

-- 假设此处发生错误
INSERT INTO order_item (order_id, item) VALUES (999, 'error');

COMMIT;

如果第二条失败,应执行:

ROLLBACK;

三、在代码中控制插入事务(常见语言)

1. Java(JDBC)

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();
}

2. Spring(推荐方式)

使用注解(最常用)

@Transactional
public void createUser() {
    userMapper.insert(user);
    userLogMapper.insert(log);
}
  • 方法抛异常 → 自动回滚
  • 成功执行完 → 自动提交

指定回滚条件

@Transactional(rollbackFor = Exception.class)

3. MyBatis

SqlSession session = sqlSessionFactory.openSession(false);
try {
    session.insert("insertUser", user);
    session.insert("insertLog", log);
    session.commit();
} catch (Exception e) {
    session.rollback();
} finally {
    session.close();
}

4. Python(SQLAlchemy)

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);
    }
}

⚠️ 注意:

  • 批量过多可能导致事务过长
  • 可按每 500–1000 条提交一次(视业务而定)

五、常见坑位提醒

  1. 忘记关闭自动提交
    conn.setAutoCommit(false);
    
  2. 异常被吞掉导致不回滚
  3. Spring 事务方法必须是 public
  4. 同一个类中调用 @Transactional 方法失效
  5. 长事务锁表,影响插入性能

六、简要总结

场景 推荐方式
简单 SQL BEGIN / COMMIT / ROLLBACK
Java 项目 Spring @Transactional
高性能批量 分批提交 + 事务
多表关联插入 一个事务内完成

如果你能告诉我使用什么数据库 / 框架 / 语言,我可以给你更精确的示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手