很多初學者以為 Service 層就是把 Controller 的代碼搬過來,或是單純封裝 DAO 調用。實際上,Service 層的核心價值在於「事務管理」。
「一條業務」= 一個原子性的業務操作單元,要么全成功,要么全失敗回滾。例如:
而「登錄」通常不涉及寫入數據庫(僅查詢驗證),不屬於需事務保護的「業務」,可直接在 Controller 或單獨的 QueryService 中處理。
@Transactional。readOnly=true)。RuntimeException/Error 回滾,檢查型異常需 rollbackFor 指定。@Service
public class OrderService {
@Autowired OrderMapper orderMapper;
@Autowired StockMapper stockMapper;
@Transactional(rollbackFor = Exception.class) // 明確所有異常回滾
public void placeOrder(OrderDTO dto) {
// 1. 扣庫存
stockMapper.deduct(dto.getSkuId(), dto.getCount());
// 2. 建訂單
orderMapper.insert(dto.toOrder());
// 3. 扣優惠券
couponMapper.use(dto.getCouponId());
// 任一步拋異常,前兩步自動回滾
}
}
Service 層不是「業務邏輯的垃圾桶」,而是事務邊界的守門人。劃分 Service 方法時,問自己:「這組操作能否部分成功?」若不能,則合併為一個事務方法。