“Rollback” và “khôi phục” là các thuật ngữ có nghĩa là đưa hệ thống, mã hoặc dữ liệu trở về trạng thái trước đó. Trong phát triển phần mềm, đây là một thao tác cơ bản được tích hợp trong các hệ thống kiểm soát phiên bản, cơ sở dữ liệu và cơ chế triển khai. Theo Tài liệu Git, các thao tác rollback có thể an toàn (revert tạo commit mới) và phá hoại (reset làm mất lịch sử). Hiểu sự khác biệt giữa chúng giúp tránh mất dữ liệu khi quay lại phiên bản trước.
Các điểm chính
Rollback là thao tác đưa hệ thống trở về trạng thái ổn định trước đó. Trong bối cảnh phát triển, điều này có thể có nghĩa là hoàn tác commit trong Git, rollback giao dịch trong cơ sở dữ liệu hoặc quay lại phiên bản trước của ứng dụng trên máy chủ. Thuật ngữ này bắt nguồn từ tiếng Anh “rollback” và đã ăn sâu vào từ vựng của các nhà phát triển trên mọi nền tảng.
Nhu cầu rollback phát sinh khi một thay đổi mới làm hỏng chức năng, gây ra lỗi hoặc không vượt qua kiểm tra chất lượng. Trong một quy trình phát triển được tổ chức tốt, rollback không phải là dấu hiệu thất bại mà là một quy trình tiêu chuẩn được xây dựng trong quy trình làm việc. Nhóm càng nhanh chóng rollback thay đổi có vấn đề thì tác động của lỗi lên người dùng càng thấp.
Các công cụ khác nhau cung cấp cơ chế rollback khác nhau: Git đưa ra lựa chọn giữa revert an toàn và reset phá hoại, cơ sở dữ liệu hỗ trợ rollback giao dịch, và hệ thống CI/CD có thể chuyển lưu lượng giữa các phiên bản. Việc lựa chọn cách tiếp cận phụ thuộc vào bối cảnh và yêu cầu bảo toàn lịch sử thay đổi.
Git revert là phương pháp rollback an toàn tạo commit mới để hoàn tác các thay đổi trước đó. Lịch sử vẫn tuyến tính và tất cả các commit cũ được bảo toàn. Đây là lựa chọn duy nhất đúng để hoàn tác trong nhánh dùng chung mà nhiều nhà phát triển làm việc. Git revert không xóa lịch sử — nó thêm sự kiện rollback như một thay đổi mới.
Git reset di chuyển con trỏ nhánh hiện tại đến một commit cụ thể, loại bỏ tất cả các thay đổi tiếp theo. Tùy theo cờ — soft, mixed hoặc hard — reset xử lý thư mục làm việc và chỉ mục khác nhau. Chế độ hard xóa hoàn toàn các thay đổi khỏi lịch sử, khiến nó nguy hiểm cho các nhánh dùng chung và chỉ phù hợp cho công việc cục bộ.
Revert được sử dụng trong các nhánh dùng chung: main, develop, release. Nó bảo toàn lịch sử và cho phép các nhà phát triển khác hiểu rằng một thay đổi đã bị hoàn tác. Sau revert, bạn có thể thực hiện git pull một cách an toàn — hệ thống sẽ không tạo ra xung đột liên quan đến lịch sử bị viết lại. Trong công việc nhóm, revert là tiêu chuẩn mặc định.
# Hoàn tác commit cuối cùng bằng cách tạo commit mới
git revert HEAD
# Hoàn tác một commit cụ thể bằng hash
git revert a1b2c3d
Reset phù hợp trong nhánh cục bộ nơi bạn chưa công bố thay đổi. Nếu bạn đang thử nghiệm và muốn làm sạch hoàn toàn lịch sử — reset hard sẽ làm điều đó. Trong nhánh cục bộ, bạn có thể sử dụng reset mixed để hoàn tác commit nhưng giữ các thay đổi trong thư mục làm việc để commit lại.
# Hoàn tác commit cuối cùng, giữ thay đổi trong thư mục làm việc
git reset HEAD~1
# Hoàn tác hoàn toàn — các thay đổi bị xóa vĩnh viễn
git reset --hard HEAD~2
Rollback giao dịch là thao tác hoàn tác tất cả các thay đổi được thực hiện trong giao dịch hiện tại và đưa cơ sở dữ liệu trở về trạng thái tại thời điểm bắt đầu giao dịch. Điều này đảm bảo tính nguyên tử — một trong bốn nguyên tắc ACID (Atomicity, Consistency, Isolation, Durability). Nếu xảy ra lỗi ở bất kỳ giai đoạn nào của giao dịch, rollback được thực hiện và dữ liệu trở về trạng thái ban đầu.
Cơ chế rollback được thực hiện thông qua nhật ký ghi trước (WAL). Trước khi sửa đổi một trang dữ liệu, DBMS ghi các giá trị cũ và mới vào nhật ký. Trong quá trình rollback, hệ thống đọc nhật ký và khôi phục các giá trị ban đầu cho tất cả các trang đã sửa đổi. Điều này đảm bảo rằng ngay cả khi mất điện, giao dịch vẫn có thể được hoàn tác một cách chính xác.
BEGIN TRANSACTION;
UPDATE accounts
SET balance = balance - 100
WHERE id = 1;
-- Rollback on error
ROLLBACK;
Trong các giao dịch dài, rất tiện lợi khi sử dụng savepoint — các điểm lưu tạm thời có thể quay lại mà không cần hoàn thành toàn bộ giao dịch. Điều này cho phép xử lý lỗi trong một thao tác phức tạp mà không làm mất tiến trình ở các phần khác. Savepoint được hỗ trợ bởi hầu hết các DBMS quan hệ: PostgreSQL, MySQL, Oracle.
SAVEPOINT sp1;
UPDATE orders SET status = 'cancelled'
WHERE id = 42;
ROLLBACK TO sp1;
Rollback triển khai là việc đưa ứng dụng đang chạy về phiên bản trước sau khi triển khai không thành công. Đây là khả năng quan trọng đối với môi trường sản xuất: thời gian khôi phục (MTTR) ảnh hưởng trực tiếp đến SLA và trải nghiệm người dùng. Các nền tảng hiện đại cung cấp một số chiến lược rollback tùy thuộc vào kiến trúc và yêu cầu về tính sẵn sàng.
Blue-green là chiến lược trong đó hai môi trường giống hệt nhau chạy đồng thời: blue (phiên bản hiện tại) và green (phiên bản mới). Lưu lượng được chuyển sang green sau khi triển khai thành công. Nếu phiên bản mới hoạt động không chính xác, bộ chuyển mạch lưu lượng quay trở lại blue. Rollback được thực hiện ngay lập tức mà không cần triển khai lại — chỉ cần thay đổi định tuyến.
Triển khai Canary hướng một phần nhỏ lưu lượng đến phiên bản mới và giám sát các chỉ số: tỷ lệ lỗi, thời gian phản hồi, tỷ lệ yêu cầu thành công. Nếu các chỉ số xấu đi, hệ thống tự động rollback canary và hướng toàn bộ lưu lượng đến phiên bản ổn định. Kubernetes và service mesh (Istio, Linkerd) hỗ trợ chiến lược này ngay từ đầu.
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 10
strategy:
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
Hãy xem xét ba kịch bản điển hình mà nhà phát triển cần rollback các thay đổi. Mỗi kịch bản yêu cầu cách tiếp cận riêng — từ một lệnh đơn giản trong terminal đến quy trình nhiều bước có sự tham gia của CI/CD.
Bạn vô tình push một commit có lỗi vào main. Nhiệm vụ của bạn là rollback các thay đổi mà không làm mất lịch sử cho nhóm. Sử dụng git revert để tạo commit hoàn tác và sau đó git push. Tất cả thành viên nhóm sẽ thấy rollback và có thể tiếp tục làm việc mà không xảy ra xung đột. Đây là phương pháp an toàn và minh bạch nhất.
git checkout main
git pull origin main
git revert HEAD
git push origin main
Di chuyển cơ sở dữ liệu thất bại và một số dữ liệu bị hỏng. Sử dụng rollback giao dịch trong tập lệnh di chuyển và khôi phục từ bản sao lưu cho các thay đổi đã áp dụng. Trong một hệ thống được thiết kế tốt, mỗi lần di chuyển được bọc trong một giao dịch — khi có lỗi, DBMS tự động thực hiện rollback.
Sau khi triển khai phiên bản mới, bạn phát hiện xác thực không hoạt động. Nếu bạn sử dụng blue-green, rollback là chuyển bộ định tuyến trở lại. Nếu là cập nhật rolling — lệnh kubectl rollout undo sẽ đưa về phiên bản trước. Lý tưởng nhất, quy trình rollback nên được tự động hóa và không mất quá một phút.
Câu hỏi thường gặp
Revert tạo commit mới hoàn tác thay đổi và bảo toàn lịch sử. Reset di chuyển con trỏ nhánh về phía sau và có thể xóa commit. Đối với nhánh dùng chung, chỉ sử dụng revert.
Nếu các commit chưa bị dọn dẹp bởi Git, chúng có thể được khôi phục qua git reflog. Tuy nhiên, sau khi dọn dẹp, việc khôi phục trở nên không thể thực hiện được. Chỉ sử dụng --hard trong các nhánh cục bộ.
Rollback hoàn tác tất cả các thay đổi trong giao dịch hiện tại bằng cách sử dụng nhật ký ghi trước (WAL). DBMS khôi phục các giá trị ban đầu cho tất cả các trang dữ liệu đã sửa đổi.
Savepoint là điểm lưu tạm thời trong một giao dịch. Nó cho phép rollback một phần mà không hủy bỏ toàn bộ giao dịch. Hữu ích trong các thao tác dài với nhiều bước.
Thiết lập health check và giám sát chỉ số sau khi triển khai. Khi vượt quá ngưỡng lỗi, kích hoạt rollback tự động thông qua tập lệnh hoặc công cụ như Spinnaker, ArgoCD hoặc GitLab Auto Rollback.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm