Tính nguyên tử (hệ cơ sở dữ liệu)

Trong hệ cơ sở dữ liệu, **tính nguyên tử** (tiếng Anh: atomicity, ) là một trong các tính chất ACID của giao dịch cơ sở dữ liệu. **Giao dịch nguyên tử** là dãy thao tác trên cơ sở dữ liệu, có tính *không thể phân chia* và *không thể rút gọn*, sao cho hoặc *tất cả* các bước đều xảy ra, hoặc là *không gì* xảy ra cả. Tính nguyên tử đảm bảo tránh được trường hợp việc cập nhật vào cơ sở dữ liệu chỉ xảy ra được có một phần, trong trường hợp này, thải bỏ hẳn cả quá trình thao tác thì sẽ đỡ vấn đề hơn là để mặc trạng thái cơ sở dữ liệu như vậy. Hệ quả là không có client cơ sở dữ liệu nào khác có thể quan sát được giao dịch như vậy khi nó đang trong giai đoạn lưng chừng. Chỉ có thể quan sát tại thời điểm khi nó chưa diễn ra, và tại thời điểm khi nó đã diễn ra toàn bộ (hoặc không thấy gì diễn ra cả nếu giao dịch bị hủy bỏ giữa chừng).

Ví dụ cho giao dịch nguyên tử đó là chuyển tiền từ tài khoản A sang tài khoản B. Việc này gồm hai thao tác: rút tiền từ tài khoản A, rồi cất tiền đó vào tài khoản B. Thực thi các thao tác này bên trong giao dịch nguyên tử như thế đảm bảo rằng cơ sở dữ liệu giữ được trạng thái nhất quán, tức là tiền không bị mất đi hay sinh ra thêm ngay cả khi một trong hai thao tác kia bị hỏng.

## Tách bạch với các tính chất khác
Tính nguyên tử có hành trạng không hoàn toàn tách bạch đối với các tính chất ACID khác của giao dịch. Ví dụ, tính cô lập thì lại cậy vào tính nguyên tử để tua ngược lại thay đổi để phòng trường hợp vòng cô lập gặp sự cố chẳng hạn như deadlock; tính nhất quán thì cũng cậy vào tính năng tua ngược để phòng trường hợp giao dịch trái phép nào đó vi phạm tính nhất quán. Cuối cùng, đến tính nguyên tử bản thân nó cũng phải cậy vào tính bền bỉ để bảo toàn tính nguyên tử của giao dịch ngay cả khi gặp hỏng hóc từ bên ngoài.

Do vậy, việc không phát hiện ra được lỗi để mà tua ngược lại giao dịch thì có thể khiến cho tính cô lập và tính nhất quán không còn giữ được nữa.

## Thực hiện
Thường thì các hệ thống thực hiện tính nguyên tử bằng các cách như là trang bị một số cơ chế để cho ta biết được giao dịch nào đã bắt đầu và giao dịch nào đã kết thúc; hoặc giữ lại bản sao của dữ liệu trước khi bất kỳ sự thay đổi (đọc-chép-sửa) nào xảy ra. Vài hệ thống file đã phát triển được phương pháp giúp tránh khỏi việc phải lưu giữ nhiều bản sao dữ liệu, đó là bằng cách sử dụng nhật chí. Cơ sở dữ liệu thường thực hiện tính chất này bằng cách sử dụng một số hình thức ghi lại 'nhật chí' / 'nhật trình' để theo dõi sự thay đổi. Hệ thống sẽ đồng bộ hóa vào nhật trình (thường hay là metadata) khi cần thiết sau khi thay đổi đã diễn ra thành công. Về sau, khi khôi phục crash thì sẽ bỏ qua những mục nào còn chưa hoàn thành. Mặc dù bản thực hiện thực tế có đổi khác đi tùy vào các yếu tố như vấn đề tác vụ tịnh hành chẳng hạn, thì nguyên lý của tính nguyên tử (ví dụ: đã xong là phải xong hẳn, đã hỏng là phải hỏng hẳn) vẫn được giữ nguyên.

Sau cùng thì bất kỳ bản thực hiện ở cấp độ ứng dụng nào thì cũng đều phải dựa vào chức năng của hệ điều hành cả. Ở cấp độ hệ thống file, các hệ thống tuân theo POSIX có cung cấp các lệnh gọi hệ thống như `open(2)` và `flock(2)` cho phép ứng dụng mở hoặc khóa file theo kiểu 'nguyên tử'. Ở cấp độ tiến trình, POSIX Thread có cung cấp đầy đủ các công cụ nguyên sơ cho việc đồng bộ hóa.

Cấp độ phần cứng thì có thể dựa vào các thao tác nguyên tử như Test-and-set, Fetch-and-add, Compare-and-swap hoặc Load-Link/Store-Conditional, cùng với cả hàng rào bộ nhớ.

## Ghi chú thuật ngữ

## Tham khảo