Transaction trong MySQL: Tổng quan, khái niệm, cơ chế

Chào anh em! Sau khi xem lại thống kê lượt xem các bài viết thì mình thấy các bài viết về SQL là những bài viết có số lượt xem nhiều nhất. Chính vì vậy mà ngày hôm nay mình quyết định viết thêm 1 series trong chuỗi chủ đề về SQL nữa. Và chủ đề mà mình muốn nói đến ngày hôm nay đó là Transaction trong SQL.

Mình nghĩ rằng đối với vị trí một lập trình viên mà nói thì Transaction thực sự là một kiến thức vô cùng cần thiết và hữu dụng. Đây là một tính năng có ở trên hầu hết các hệ quản trị CSDL như MySQL, SQL Server, Oracle,… hay hệ cơ sở dữ liệu dạng NoSQL (MongoDB, CouchDB, Amazon DynamoDB,…).

Nhắc đến transaction thì các bạn sẽ nghĩ đến gì đó liên quan đến ngân hàng hay tiền bạc đúng không nhỉ. Đúng là như vậy, nó tất nhiên được ứng dụng nhiều ở các hệ thống ngân hàng, hệ thống liên quan đến tiền bạc. Nhưng nó còn được ứng dụng ở nhiều các hệ thống khác nữa như blog, tin tức, forum,…

Nói như vậy có nghĩa là nó được ứng dụng, sử dụng trong hầu hết các hệ thống, phần mềm,… mà các mà các hệ thống đó có thao tác liên quan đến CSDL.

Những khái niệm, kiến thức, ví dụ trong bài viết này là do mình tham khảo, tìm kiếm hoặc tự đưa ra theo quan điểm cá nhân. Chính vì thế mà đôi khi vẫn còn những điểm sai sót mong anh em góp ý để mình sửa lại nhé. Let’s go!!!

Transaction với ví dụ trực quan

Theo Google Dịch thì transaction có nghĩa là giao dịch. Hmm. Với giao dịch thì các bạn nghĩ đến điều gì nhỉ? Mình sẽ có 1 ví dụ thực tế về giao dịch cho các bạn hiểu:

Một ngày đẹp trời, Tiến nhận được cuộc gọi từ bạn Văn (bạn 5 năm chưa gặp) với nội dung là cho bạn Văn vay 5 triệu với lời hứa quen thuộc: “Yên tâm đi bạn, đúng 1 tuần sau mình trả”. Thế là Tiến dùng chiếc điện thoại của mình để chuyển tiền cho bạn Văn.

Lúc này Tiến rút điện thoại ra và chuyển tiền cho Văn tới số tài khoản XXX. Hãy tưởng tượng lúc này hệ thống cần làm những nhiệm vụ gì vào cơ sở dữ liệu để hoàn thành giao dịch? Lưu ý: nhiệm vụ đơn giản, cơ bản vì mình ko làm ngân hàng nên ko biết nghiệp vụ phía sau là gì.

Bước 1: Hệ thống tiến hành trừ tiền tài khoản của Tiến 5.000.000

Bước 2: Hệ thống tiến hành cộng tiền vào tài khoản Văn 5.000.000

Bước 3: Còn gì nữa không nhỉ? Còn chứ. Hệ thống lưu lại thông tin giao dịch để đối soát sau này.

Như vậy là hệ thống cần thực hiện ít nhất 3 thao tác vào trong CSDL như trên. Hãy tưởng tượng xem có chuyện gì xảy ra nếu 1 trong 3 bước trên bị lỗi?

Bước 1 bị lỗi? Tiến không bị trừ tiền nhưng Văn vẫn nhận được tiền. Như vậy ngân hàng sẽ bị lỗ 5.000.000

Bước 2 bị lỗi? Tiến bị trừ tiền nhưng Văn không nhận được tiền? Oh man. Lúc này Tiến vừa bị mất tiền, vừa bị mang cái danh ngụy quân tử. Tưởng cho vay mà hóa ra…

Bước 3 lỗi thì sao nhỉ? Ko có lịch sử, không có bằng chứng giao dịch. Sau này Văn bùng kèo thì Tiến sẽ ko có chứng cứ chứng minh để đưa cho công an. Ngân hàng cũng bị mất uy tín nữa.

Kết luận: Như vậy có nghĩa là khi một transaction (giao dịch) được thực hiện thì cả 3 hành động, thao tác vào trong CSDL PHẢI thành công thì giao dịch mới được gọi là thành công (transaction được commit).

Còn lại nếu 1 trong 3 hành động bị lỗi thì coi như là transaction thất bại, tất cả sẽ ko được thực hiện (transaction được rollback).

Transaction trong SQL

Tèn ten. Ngoài ví dụ về giao dịch ngân hàng như trên thì còn rất rất nhiều trường hợp chúng ta cần dùng transaction nữa. Chính vì vậy mà cơ chế Transaction được sinh ra trong các hệ quản trị CSDL để đảm bảo tính đúng đắn, toàn vẹn của dữ liệu.

Lưu ý transaction này là transaction chứ ko phải là transaction như trên, nhớ đừng nhầm giữa transaction này với transaction kia nhá. Mình đùa đấy. Mệt quá =))

Các bước thực hiện transaction

  1. Bắt đầu transaction
  2. Thực thi một tập hợp các thao tác query vào CSDL
  3. Nếu có lỗi xảy ra trong bất cứ thao tác hoặc query nào thì tiến hành rollback dữ liệu. Coi như không có việc gì xảy ra.
  4. Nếu không có lỗi, tất cả đều thực hiện thành công thì tiến hành commit dữ liệu để chính thức lưu vào CSDL.

Tại sao lại là CHÍNH THỨC?

Điều đó có nghĩa là bên trong 1 transaction đang diễn ra, dữ liệu vẫn sẽ giả vờ như được lưu lại. Nhưng chỉ là lưu vào 1 bộ nhớ tạm (tạm hiểu như vậy) thôi chứ ko lưu vào bộ nhớ thật. Vi dụ:

Bắt đầu Transaction
Select count bảng A -> ra 5 bản ghi
Insert vào bảng A 
Select count bảng A -> 6 bản ghi
Kết thúc Transaction

Đó, tức là trong transaction bạn vẫn thấy dữ liệu có sự thay đổi. Nhưng thực ra đó chỉ là tạm thôi.

Các thuộc tính của Transaction

  • Atomicity: Một transaction xác định ranh giới của nó rất rõ ràng, tức xác định điểm bắt đầu và kết thúc của tiến trình. Như vậy có thể coi nó như một đơn vị thực thi và đơn vị thực thi này thực hiện theo nguyên tắc “all or nothing”. Nghĩa là nếu một thành phần nào đó trong transaction thực thi lỗi thì đồng nghĩa với việc không có gì xảy ra tức không có gì thay đổi về mặt dữ liệu.
  • Consistency: Dữ liệu nhất quán với transaction ở thời điểm bắt đầu và kết thúc hay bảo đảm rằng Database thay đổi một cách chính xác trạng thái theo một transaction đã được commit thành công.
  • Isolation: Các transaction có khả năng hoạt động một cách độc lập và không liên quan đến nhau.
  • Durability: Dữ liệu của transaction sau khi thực thi xong được cố định, chính thức và bền vững. Nghĩa là những thay đổi đã được cố định, không có chuyện có thể chuyển lại trạng thái dữ liệu lúc trước khi thực hiện transaction.

Tổng kết

Trên đây là những lý thuyết về Transaction. Về các sử dụng chi tiết trong SQL như thế nào, những lưu ý khi sử dụng là gì thì mình sẽ viết ở bài sau các bạn nhé. Hẹn gặp lại các bạn!!!

Nguồn: VanTien.Net

Tham khảo:

https://techmaster.vn/posts/26316/transaction-la-gi

https://en.wikipedia.org/wiki/Database_transaction

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *