Làm cách nào để bắt đầu giao dịch trong mysql?

Giao dịch là một nhóm tuần tự các câu lệnh SQL như chọn, chèn, cập nhật hoặc xóa, được thực hiện như một đơn vị công việc duy nhất

Nói cách khác, một giao dịch sẽ không bao giờ hoàn thành trừ khi từng hoạt động riêng lẻ trong nhóm thành công. Nếu bất kỳ hoạt động nào trong giao dịch không thành công, toàn bộ giao dịch sẽ thất bại

Giao dịch ngân hàng sẽ là ví dụ tốt nhất để giải thích điều này. Xem xét chuyển khoản giữa hai tài khoản. Để đạt được điều này, bạn phải viết các câu lệnh SQL thực hiện như sau

  1. Kiểm tra tính khả dụng của số tiền được yêu cầu trong tài khoản đầu tiên
  2. Khấu trừ số tiền được yêu cầu từ tài khoản đầu tiên
  3. Gửi tiền vào tài khoản thứ hai

Nếu bất kỳ ai trong quá trình này không thành công, toàn bộ sẽ được hoàn nguyên về trạng thái trước đó của họ

AXIT. Thuộc tính của giao dịch

Giao dịch có bốn thuộc tính tiêu chuẩn sau

  • nguyên tử. đảm bảo rằng tất cả các hoạt động trong đơn vị công việc được hoàn thành thành công;
  • Tính nhất quán. đảm bảo rằng cơ sở dữ liệu thay đổi đúng trạng thái khi giao dịch được thực hiện thành công
  • Sự cô lập. cho phép các giao dịch hoạt động độc lập và minh bạch với nhau
  • Độ bền. đảm bảo rằng kết quả hoặc hiệu quả của giao dịch đã cam kết vẫn tồn tại trong trường hợp lỗi hệ thống

Các giao dịch bắt đầu bằng câu lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

8 hoặc

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

9 và kết thúc bằng câu lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

0 hoặc

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

1. Các lệnh SQL giữa các câu lệnh bắt đầu và kết thúc tạo thành phần lớn giao dịch

START TRANSACTION;
SET @transAmt = '500';
SELECT @availableAmt:=ledgerAmt FROM accTable WHERE customerId=1 FOR UPDATE;
UPDATE accTable SET ledgerAmt=ledgerAmt-@transAmt WHERE customerId=1;
UPDATE accTable SET ledgerAmt=ledgerAmt+@transAmt WHERE customerId=2;
COMMIT;

Với

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

8, autocommit vẫn bị vô hiệu hóa cho đến khi bạn kết thúc giao dịch với

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

0 hoặc

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

1. Chế độ autocommit sau đó trở lại trạng thái trước đó

Giao dịch là một cách để cơ sở dữ liệu nhóm các câu lệnh có liên quan lại với nhau để hệ thống thực thi như một đơn vị duy nhất. Các câu lệnh được xử lý như một đơn vị, với tất cả các bộ phận cấu thành hoàn thành thành công hoặc trở lại trạng thái ban đầu. Đây là một cách để duy trì tính nhất quán cho những thay đổi cần thực hiện nhiều bước riêng lẻ để đạt được một mục tiêu duy nhất

Trong bài viết này, chúng ta sẽ nói về giao dịch là gì và chúng có thể hữu ích như thế nào. Sau đó, chúng ta sẽ xem cách MySQL sử dụng các giao dịch theo nhiều cách khác nhau để kiểm soát chính xác cách các câu lệnh được áp dụng cho cơ sở dữ liệu

Giao dịch là gì?

là một cách để nhóm lại với nhau và tách biệt nhiều câu lệnh để xử lý như một thao tác đơn lẻ. Thay vì thực thi từng lệnh riêng lẻ khi nó được gửi đến máy chủ, trong một giao dịch, các lệnh được nhóm lại với nhau và được thực thi trong một ngữ cảnh riêng biệt so với các yêu cầu khác

là một phần quan trọng của giao dịch. Trong một giao dịch, các câu lệnh được thực hiện chỉ có thể ảnh hưởng đến môi trường trong chính giao dịch đó. Từ bên trong giao dịch, các câu lệnh có thể sửa đổi dữ liệu và kết quả hiển thị ngay lập tức. Từ bên ngoài, không có thay đổi nào được thực hiện cho đến khi giao dịch được thực hiện, tại thời điểm đó, tất cả các hành động trong giao dịch sẽ hiển thị cùng một lúc

Các tính năng này giúp cơ sở dữ liệu đạt được bằng cách cung cấp (các hành động trong giao dịch đều được cam kết hoặc hoàn tất) và cách ly (bên ngoài giao dịch, không có gì thay đổi cho đến khi cam kết, trong khi bên trong, mỗi câu lệnh có hậu quả ngay lập tức). Những điều này cùng nhau giúp cơ sở dữ liệu duy trì tính nhất quán (bằng cách đảm bảo rằng việc chuyển đổi dữ liệu một phần không thể xảy ra). Hơn nữa, các thay đổi trong giao dịch không được trả lại là thành công cho đến khi chúng được cam kết lưu trữ không bay hơi, điều này cung cấp

Để đạt được những mục tiêu này, các giao dịch sử dụng một số chiến lược khác nhau và các hệ thống cơ sở dữ liệu khác nhau sử dụng các phương pháp khác nhau. MySQL sử dụng một hệ thống có tên , cho phép cơ sở dữ liệu thực hiện các hành động này bằng cách sử dụng ảnh chụp nhanh dữ liệu. Tất cả cùng nhau, các hệ thống này bao gồm một trong những khối xây dựng cơ bản của cơ sở dữ liệu quan hệ hiện đại, cho phép chúng xử lý dữ liệu phức tạp một cách an toàn theo cách chống sự cố

Các loại lỗi nhất quán

Một lý do khiến mọi người sử dụng giao dịch là để đạt được sự đảm bảo nhất định về tính nhất quán của dữ liệu của họ và môi trường mà dữ liệu được xử lý. Tính nhất quán có thể bị phá vỡ theo nhiều cách khác nhau, điều này ảnh hưởng đến cách cơ sở dữ liệu cố gắng ngăn chặn chúng

Có bốn cách chính mà sự không nhất quán có thể phát sinh tùy thuộc vào việc thực hiện giao dịch. Khả năng chịu đựng của bạn đối với các tình huống mà các tình huống này có thể phát sinh sẽ ảnh hưởng đến cách bạn sử dụng các giao dịch trong ứng dụng của mình

bẩn đọc

xảy ra khi các câu lệnh trong một giao dịch có thể đọc dữ liệu được ghi bởi các giao dịch đang thực hiện khác. Điều này có nghĩa là mặc dù các tuyên bố của một giao dịch chưa được thực hiện nhưng chúng có thể được đọc và do đó ảnh hưởng đến các giao dịch khác

Điều này thường được coi là vi phạm tính nhất quán nghiêm trọng, vì các giao dịch không được cách ly đúng cách với nhau. Các câu lệnh có thể không bao giờ được cam kết với cơ sở dữ liệu có thể ảnh hưởng đến việc thực hiện các giao dịch khác, sửa đổi hành vi của chúng

Các giao dịch cho phép đọc bẩn không thể đưa ra bất kỳ tuyên bố hợp lý nào về tính nhất quán của dữ liệu kết quả

đọc không lặp lại

xảy ra khi một cam kết bên ngoài giao dịch làm thay đổi dữ liệu nhìn thấy trong giao dịch. Bạn có thể nhận ra loại sự cố này nếu trong một giao dịch, cùng một dữ liệu được đọc hai lần nhưng các giá trị khác nhau được truy xuất trong mỗi trường hợp

Cũng giống như các lần đọc bẩn, các giao dịch cho phép các lần đọc không lặp lại không cung cấp sự cách ly hoàn toàn giữa các giao dịch. Sự khác biệt là với các lần đọc không lặp lại, các câu lệnh ảnh hưởng đến giao dịch đã thực sự được thực hiện bên ngoài giao dịch

ma đọc

A là một kiểu đọc không thể lặp lại cụ thể xảy ra khi các hàng được truy vấn trả về khác với lần thứ hai nó được thực hiện trong một giao dịch

Chẳng hạn, nếu một truy vấn trong giao dịch trả về bốn hàng trong lần đầu tiên nó được thực thi, nhưng năm hàng trong lần thứ hai, thì đây là một lần đọc ảo. Các lần đọc ảo được gây ra bởi các cam kết bên ngoài giao dịch làm thay đổi số lượng hàng đáp ứng truy vấn

Bất thường tuần tự hóa

xảy ra khi kết quả của nhiều giao dịch được thực hiện đồng thời sẽ dẫn đến các kết quả khác nhau so với khi chúng được thực hiện lần lượt. Điều này có thể xảy ra bất kỳ lúc nào một giao dịch cho phép hai lần xác nhận xảy ra, mỗi lần sửa đổi cùng một bảng hoặc dữ liệu mà không giải quyết xung đột

Mức cô lập giao dịch

Giao dịch không phải là giải pháp "một kích thước phù hợp với tất cả". Các kịch bản khác nhau đòi hỏi sự đánh đổi khác nhau giữa hiệu suất và khả năng bảo vệ. May mắn thay, MySQL cho phép bạn chỉ định loại cách ly giao dịch mà bạn cần

Các mức cô lập được cung cấp bởi hầu hết các hệ thống cơ sở dữ liệu bao gồm:

Đọc không cam kết

là mức cách ly cung cấp ít đảm bảo nhất về việc duy trì tính nhất quán và cách ly dữ liệu. Mặc dù các giao dịch sử dụng

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

5 có một số tính năng nhất định thường được liên kết với các giao dịch, như khả năng thực hiện nhiều câu lệnh cùng một lúc hoặc khôi phục các câu lệnh nếu xảy ra lỗi, nhưng chúng cho phép nhiều tình huống có thể phá vỡ tính nhất quán

Các giao dịch được định cấu hình với mức cách ly

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

5 cho phép

  • đọc bẩn
  • đọc không lặp lại
  • ảo đọc
  • dị thường tuần tự hóa

Mức độ cách ly này thường không được khuyến nghị vì nó hầu như không đảm bảo về tính nhất quán và cách ly dữ liệu. Điều này chủ yếu hữu ích nếu bạn cần nhóm các câu lệnh lại với nhau trong mô hình cam kết "tất cả hoặc không có gì", nhưng không cần bất kỳ đảm bảo tính toàn vẹn nào (rất hiếm khi xảy ra)

Đọc cam kết

là một mức cô lập đặc biệt bảo vệ chống đọc bẩn. Khi giao dịch sử dụng mức nhất quán

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

0, dữ liệu không được cam kết không bao giờ có thể ảnh hưởng đến bối cảnh nội bộ của giao dịch. Điều này cung cấp mức độ nhất quán cơ bản bằng cách đảm bảo rằng dữ liệu không được cam kết không bao giờ ảnh hưởng đến giao dịch

Mặc dù

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

0 cung cấp khả năng bảo vệ tốt hơn so với

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

5, nhưng nó không bảo vệ chống lại tất cả các loại mâu thuẫn. Những vấn đề này vẫn có thể phát sinh

  • đọc không lặp lại
  • ảo đọc
  • dị thường tuần tự hóa

đọc lặp lại

Mức độ cô lập được xây dựng dựa trên sự đảm bảo được cung cấp bởi

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

0. Nó tránh các lần đọc bẩn như trước đây, nhưng cũng ngăn chặn các lần đọc không lặp lại

Mặc dù

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

4 có thể ngăn các lần đọc không lặp lại và đọc bẩn, nhưng nó vẫn có thể gặp phải các sự cố cô lập này

  • ảo đọc
  • dị thường tuần tự hóa

Trong hầu hết các trường hợp, đọc ảo cũng sẽ bị ngăn chặn, nhưng có một số trường hợp chúng vẫn có thể xảy ra. Trong ví dụ được liên kết, truy vấn

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

5 trong một giao dịch không trả về kết quả nào, ngay cả sau khi một hàng được chèn và thực hiện bởi một giao dịch khác. Tuy nhiên, việc đưa ra một truy vấn sẽ cập nhật hàng mới sẽ dẫn đến truy vấn trả về dữ liệu, mặc dù bản cập nhật sẽ không biết về hàng được thực hiện bởi giao dịch khác. Truy vấn

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

5 sau đó trả về dữ liệu

Đối với công cụ InnoDB của MySQL (công cụ thông thường trong hầu hết các trường hợp), phương thức cách ly đọc lặp lại là mặc định

tuần tự hóa

Mức cô lập cung cấp mức độ cô lập và nhất quán cao nhất. Nó ngăn chặn tất cả các tình huống mà cấp độ

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

4 thực hiện đồng thời loại bỏ khả năng xảy ra các bất thường về tuần tự hóa

Cách ly tuần tự hóa đảm bảo rằng các giao dịch đồng thời được cam kết như thể chúng được thực hiện lần lượt. Nếu một kịch bản xảy ra trong đó có thể đưa ra sự bất thường về tuần tự hóa, thì một trong các giao dịch sẽ bị lỗi tuần tự hóa thay vì gây ra sự không nhất quán cho tập dữ liệu

Định nghĩa một giao dịch

Bây giờ chúng ta đã đề cập đến các mức cô lập khác nhau mà MySQL có thể sử dụng trong các giao dịch, hãy trình bày cách xác định các giao dịch

Trong MySQL, theo mặc định, mọi câu lệnh bên ngoài giao dịch được đánh dấu rõ ràng thực sự được thực thi trong giao dịch một câu lệnh của chính nó. Để bắt đầu một khối giao dịch một cách rõ ràng, bạn có thể sử dụng lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

8 hoặc

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

9. Biểu mẫu

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

8 có thể nhận các công cụ sửa đổi mà biểu mẫu

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

9 không thể, vì vậy MySQL khuyên bạn nên sử dụng

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

8. Để thực hiện một giao dịch, hãy đưa ra lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

33

Do đó, cú pháp cơ bản của một giao dịch trông như thế này

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

4

Một ví dụ cụ thể hơn, hãy tưởng tượng rằng chúng ta đang cố gắng chuyển $1000 từ tài khoản này sang tài khoản khác. Chúng tôi muốn đảm bảo rằng tiền sẽ luôn ở một trong hai tài khoản chứ không bao giờ ở cả hai tài khoản

Chúng ta có thể gói hai câu lệnh cùng nhau đóng gói chuyển khoản này trong một giao dịch giống như thế này

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

Ở đây, $1000 sẽ không bị rút khỏi tài khoản với

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

34 mà không đưa $1000 vào tài khoản với

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

35. Mặc dù hai câu lệnh này được thực thi tuần tự trong giao dịch, nhưng chúng sẽ được cam kết và do đó được thực thi đồng thời trên tập dữ liệu cơ bản

Quay lui giao dịch

Trong một giao dịch, tất cả hoặc không có câu lệnh nào sẽ được cam kết với cơ sở dữ liệu. Việc loại bỏ các câu lệnh và sửa đổi được thực hiện trong một giao dịch thay vì áp dụng chúng vào cơ sở dữ liệu được gọi là "khôi phục" giao dịch

Giao dịch có thể được khôi phục tự động hoặc thủ công. MySQL tự động khôi phục các giao dịch nếu một trong các câu lệnh trong đó gây ra lỗi hoặc trong các tình huống khác để tránh sự cố

Để hoàn nguyên thủ công các câu lệnh đã được đưa ra trong giao dịch hiện tại, bạn có thể sử dụng lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

36. Điều này sẽ hủy bỏ tất cả các báo cáo trong giao dịch, về bản chất là quay ngược đồng hồ về thời điểm bắt đầu giao dịch

Ví dụ: giả sử chúng tôi đang sử dụng cùng một ví dụ về tài khoản ngân hàng mà chúng tôi đã sử dụng trước đây, nếu sau khi phát hành báo cáo

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

37, chúng tôi phát hiện ra rằng chúng tôi đã vô tình chuyển sai số tiền hoặc sử dụng sai tài khoản, chúng tôi có thể khôi phục các thay đổi thay vì thực hiện chúng

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

3

Sau khi chúng tôi

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

36, $1500 sẽ vẫn ở trong tài khoản với

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

34

Sử dụng điểm lưu khi quay lại

Theo mặc định, lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

36 đặt lại giao dịch về vị trí khi lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

8 hoặc

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

9 được gọi lần đầu tiên. Nhưng nếu chúng ta chỉ muốn hoàn nguyên một số câu lệnh trong giao dịch thì sao?

Mặc dù bạn không thể chỉ định các vị trí tùy ý để quay lại khi ban hành lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

36, nhưng bạn có thể quay lại bất kỳ "điểm lưu" nào mà bạn đã đặt trong suốt giao dịch. Bạn có thể đánh dấu trước các vị trí trong giao dịch của mình bằng lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

74 và sau đó tham khảo các vị trí cụ thể đó khi bạn cần quay lại

Các điểm lưu này cho phép bạn tạo một điểm quay lại trung gian. Sau đó, bạn có thể tùy chọn hoàn nguyên bất kỳ câu lệnh nào được thực hiện giữa vị trí hiện tại của bạn và điểm lưu, sau đó tiếp tục thực hiện giao dịch của mình

Để chỉ định một điểm lưu, hãy đưa ra lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

74 theo sau là tên cho điểm lưu

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

7

Để quay lại điểm lưu đó, hãy sử dụng lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

76

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

1

Hãy tiếp tục ví dụ tập trung vào tài khoản mà chúng tôi đang sử dụng

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

2

Tại đây, chúng tôi có thể khôi phục sau một lỗi mà chúng tôi đã mắc phải mà không làm mất tất cả công việc chúng tôi đã thực hiện trong giao dịch cho đến nay. Sau khi khôi phục, chúng tôi tiếp tục giao dịch theo kế hoạch bằng cách sử dụng các câu lệnh chính xác

Đặt mức độ cô lập của giao dịch

Để thiết lập mức độ cô lập mà bạn muốn cho một giao dịch, bạn có thể sử dụng câu lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

77 với mệnh đề

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

78. Câu lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

77 cho phép bạn sửa đổi các mức cô lập và quyền đọc và ghi của các giao dịch

Theo mặc định, câu lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

77 chỉ ảnh hưởng đến các thuộc tính của giao dịch tiếp theo được bắt đầu. Nó phải được đưa ra trước câu lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

8 hoặc

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

9. Cú pháp cơ bản trông như thế này

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

9

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

13 có thể là bất kỳ trong số này (được mô tả chi tiết trước đó)

  • START TRANSACTION;

    UPDATE accounts

    SET balance = balance - 1000

    WHERE id = 1;

    UPDATE accounts

    SET balance = balance + 1000

    WHERE id = 2;

    COMMIT;

    14
  • START TRANSACTION;

    UPDATE accounts

    SET balance = balance - 1000

    WHERE id = 1;

    UPDATE accounts

    SET balance = balance + 1000

    WHERE id = 2;

    COMMIT;

    15
  • START TRANSACTION;

    UPDATE accounts

    SET balance = balance - 1000

    WHERE id = 1;

    UPDATE accounts

    SET balance = balance + 1000

    WHERE id = 2;

    COMMIT;

    16 (Chế độ hoạt động mặc định của MySQL)
  • START TRANSACTION;

    UPDATE accounts

    SET balance = balance - 1000

    WHERE id = 1;

    UPDATE accounts

    SET balance = balance + 1000

    WHERE id = 2;

    COMMIT;

    17

Bạn cũng có thể cung cấp các từ khóa

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

18 hoặc

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

19 khi ban hành lệnh để tác động đến một phạm vi khác

Nếu bạn nhập

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

20, mức cô lập sẽ được thay đổi trên toàn cầu cho tất cả các phiên trong tương lai. Bất kỳ phiên hiện tại nào cũng sẽ sử dụng mức cô lập cũ, vì vậy hãy đảm bảo sửa đổi các phạm vi đó một cách rõ ràng nếu bạn cần thay đổi các phạm vi đó bằng cấp giao dịch hoặc cấp

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

19

Công cụ sửa đổi

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

19 (như trong

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

23) cho phép bạn thay đổi mức cô lập cho bất kỳ giao dịch nào trong tương lai trong cùng một phiên. Một lần nữa, điều này không ảnh hưởng đến bất kỳ giao dịch hiện có nào

Khía cạnh khác mà bạn có thể sửa đổi với

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

77 là liệu giao dịch có khả năng đọc/ghi hay chỉ đọc. Theo mặc định, các giao dịch trong MySQL có khả năng đọc và ghi. Bạn có thể đặt phiên chỉ đọc bằng cách sử dụng

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

25. Nếu bạn muốn thực hiện một phiên đọc/ghi một cách rõ ràng, bạn cũng có thể phát hành

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

26

Chuỗi giao dịch

Nếu bạn có nhiều giao dịch cần được thực hiện tuần tự, bạn có thể tùy ý xâu chuỗi chúng lại với nhau bằng cách sử dụng lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

27

Lệnh

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

27 hoàn thành giao dịch hiện tại bằng cách thực hiện các câu lệnh trong. Sau khi xác nhận đã được xử lý, nó sẽ ngay lập tức mở một giao dịch mới với cùng mức cô lập. Điều này cho phép bạn nhóm các câu lệnh khác lại với nhau trong một giao dịch

Tuyên bố hoạt động chính xác như thể bạn đã ban hành

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

29

START TRANSACTION;

UPDATE accounts

SET balance = balance - 1000

WHERE id = 1;

UPDATE accounts

SET balance = balance + 1000

WHERE id = 2;

COMMIT;

7

Chuỗi giao dịch giúp tạo nhiều giao dịch mà không cần phải đặt rõ ràng cấp độ giao dịch mỗi lần hoặc sửa đổi phiên hoặc mặc định chung

Phần kết luận

Giao dịch cung cấp một số chức năng hữu ích có thể giúp giữ dữ liệu của bạn ở trạng thái nhất quán. Tuy nhiên, các mức cô lập khác nhau có một số sự đánh đổi mà bạn nên cố gắng ghi nhớ. Việc xác định mức độ bảo vệ thích hợp cho trường hợp sử dụng của bạn có thể yêu cầu một số khám phá và suy nghĩ. Điều này đặc biệt đúng nếu các giao dịch sẽ chạy trong một thời gian dài, vì cơ sở dữ liệu có thể thay đổi đáng kể trước khi một cam kết xảy ra, điều này có thể dẫn đến khôi phục và nhiều công việc thủ công hơn

Ngay cả với những thiếu sót của chúng, các giao dịch vẫn hữu ích trong nhiều tình huống vì chúng thể hiện sự đóng góp đáng kể cho ACID đảm bảo rằng cơ sở dữ liệu quan hệ được kỳ vọng sẽ cung cấp. Hiểu khi nào nên sử dụng chúng, loại mức cô lập nào có ý nghĩa và cách tránh quay lui tự động là kiến ​​thức đáng để đầu tư

Lệnh nào dùng để BẮT ĐẦU GIAO DỊCH?

Lệnh SET TRANSACTION có thể được sử dụng để bắt đầu giao dịch cơ sở dữ liệu.

Làm thế nào để một giao dịch bắt đầu?

Để bắt đầu giao dịch, bạn sử dụng câu lệnh BẮT ĐẦU GIAO DỊCH . BEGIN hoặc BEGIN WORK là bí danh của BẮT ĐẦU GIAO DỊCH. Để cam kết giao dịch hiện tại và thực hiện các thay đổi của nó vĩnh viễn, bạn sử dụng câu lệnh COMMIT. Để khôi phục giao dịch hiện tại và hủy các thay đổi của nó, bạn sử dụng câu lệnh ROLLBACK.

Làm cách nào để sử dụng bắt đầu và kết thúc trong MySQL?

BẮT ĐẦU. Cú pháp END được sử dụng để viết các câu lệnh ghép , có thể xuất hiện trong các chương trình được lưu trữ (các thủ tục và hàm được lưu trữ, trình kích hoạt và sự kiện). Một câu lệnh ghép có thể chứa nhiều câu lệnh, được bao bởi các từ khóa BEGIN và END.

Làm cách nào để kiểm tra giao dịch trong MySQL?

Bằng cách thực hiện lệnh SELECT @@TX_ISOLATION chúng ta có thể kiểm tra mức cô lập giao dịch MySQL hiện tại.