在 Java 里,DAO 层到底要不要控制事务,以及怎么控制才“好”,核心原则是:
事务应该在“业务边界”控制,而不是在 DAO 层控制
下面分层说清楚。
@Service
public class OrderService {
@Transactional
public void createOrder(Order order) {
orderDao.insert(order);
stockDao.decrease(order.getProductId());
// 任一失败,整体回滚
}
}
@Repository
public class OrderDao {
public void insert(Order order) {
// 只写 SQL
}
}
✅ 这是 Spring 项目最推荐的方式
❌ 在 DAO 里:
public void insert(Order order) {
Connection conn = dataSource.getConnection();
conn.setAutoCommit(false);
try {
// ...
conn.commit();
} catch {
conn.rollback();
}
}
问题:
只在非 Spring / 老系统 / 工具类中:
try (Connection conn = dataSource.getConnection()) {
conn.setAutoCommit(false);
// DAO 操作
conn.commit();
} catch (Exception e) {
conn.rollback();
}
⚠️ 仅限:
@Transactional@Transactional(
propagation = Propagation.REQUIRED,
isolation = Isolation.READ_COMMITTED,
rollbackFor = Exception.class
)
❗ 方法必须是 public
❗ 自调用(同类方法调用)事务失效
❗ 默认只回滚 RuntimeException
Spring 用 ThreadLocal + AOP:
Service(Transaction)
├─ DAO1 (同一 Connection)
├─ DAO2 (同一 Connection)
只要:
DataSource✅ 自动共享连接
DAO 不控制事务,Service 用
@Transactional控制事务,才是最干净、可维护的做法。
如果你愿意,我可以:
你是用的哪种?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。