温馨提示×

温馨提示×

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

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

java DAO事务如何管理

发布时间:2026-09-14 21:53:07 来源:亿速云 阅读:98 作者:小樊 栏目:编程语言

在 Java 中,DAO(Data Access Object)本身通常不直接管理事务,事务一般在 Service 层 统一管理。下面从「概念 → 常见方式 → 示例」逐步说明。


一、事务管理的基本思想

  • DAO 层:只负责 SQL / 数据访问
  • Service 层:负责业务逻辑 + 事务边界
  • 事务原则:一个业务方法 = 一个事务

❌ 错误做法:在 DAO 里 commit / rollback
✅ 正确做法:Service 控制事务,DAO 只执行 SQL


二、Java 中常见的 DAO 事务管理方式

1️⃣ JDBC 手动事务(最基础)

// Service 层
public void transfer(int from, int to, double money) {
    Connection conn = null;
    try {
        conn = dataSource.getConnection();
        conn.setAutoCommit(false);

        userDao.updateBalance(conn, from, -money);
        userDao.updateBalance(conn, to, money);

        conn.commit();
    } catch (Exception e) {
        conn.rollback();
    } finally {
        conn.close();
    }
}

DAO 示例:

public void updateBalance(Connection conn, int userId, double amount) {
    PreparedStatement ps = conn.prepareStatement(
        "update user set balance = balance + ? where id = ?");
    ps.setDouble(1, amount);
    ps.setInt(2, userId);
    ps.executeUpdate();
}

✅ 优点:清晰
❌ 缺点:代码繁琐


2️⃣ Spring + DAO + 声明式事务(最常用 ✅)

(1)DAO(无事务代码)

@Repository
public class UserDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void updateBalance(int userId, double amount) {
        jdbcTemplate.update(
            "update user set balance = balance + ? where id = ?",
            amount, userId
        );
    }
}

(2)Service(事务在这里)

@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    @Transactional
    public void transfer(int from, int to, double money) {
        userDao.updateBalance(from, -money);
        userDao.updateBalance(to, money);
    }
}

✅ 优点:

  • 零事务代码
  • 异常自动回滚
  • 可配置传播行为

3️⃣ Spring 编程式事务(精细控制)

@Autowired
private TransactionTemplate transactionTemplate;

public void transfer(int from, int to, double money) {
    transactionTemplate.execute(status -> {
        userDao.updateBalance(from, -money);
        userDao.updateBalance(to, money);
        return null;
    });
}

✅ 适合复杂事务逻辑


4️⃣ MyBatis + Spring 事务

DAO(Mapper):

@Mapper
public interface UserMapper {
    void updateBalance(@Param("id") int id, @Param("amount") double amount);
}

Service:

@Transactional
public void transfer(int from, int to, double money) {
    userMapper.updateBalance(from, -money);
    userMapper.updateBalance(to, money);
}

三、事务关键配置(Spring)

@EnableTransactionManagement
@Configuration
public class TxConfig {

    @Bean
    public PlatformTransactionManager transactionManager(DataSource ds) {
        return new DataSourceTransactionManager(ds);
    }
}

四、事务注意事项(非常重要)

✅ 1. 异常才会回滚

默认只回滚 RuntimeException

@Transactional(rollbackFor = Exception.class)

✅ 2. 自调用事务失效

this.method(); // ❌ @Transactional 无效

✅ 3. DAO 不要写 commit

否则事务无法统一管理


五、总结一句话

DAO 只管 SQL,Service 管事务,Spring 帮你 commit / rollback

如果你用的是:

  • JDBC / MyBatis / JPA / Spring Boot
    我可以给你对应完整示例。
向AI问一下细节

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

AI
助
手