It runs the method inside a transaction; by default Spring rolls back on unchecked (`RuntimeException`) errors. A common gotcha is self-invocation: calling a `@Transactional` method from the same class bypasses the proxy, so the transaction may not start.
@Service
class PaymentService {
@Transactional
public void pay() {
// DB writes here
}
}