Phục hồi MySQL sau INSERT

tôi tò mò muốn biết nếu tôi cập nhật một vài dữ liệu trong bảng do nhầm lẫn thì làm cách nào để khôi phục những thay đổi đó

tương tự cũng được áp dụng cho chèn và xóa. vui lòng chia sẻ một số sql giúp tôi khôi phục dữ liệu để chèn/cập nhật và xóa. cảm ơn

sql-server-transact-sql

Bình luận

Nhận xét · Hiển thị 1

Bình luận

5. Cần 1600 ký tự còn lại ký tự

  • Hiển thị cho tất cả người dùng
  • Hiển thị với người đăng gốc & Microsoft
  • Người kiểm duyệt có thể xem
  • Có thể xem bởi người kiểm duyệt và người đăng gốc
  • Khả năng hiển thị nâng cao
Chuyển đổi chế độ hiển thị Nhận xét. Hiển thị hiện tại. Hiển thị với tất cả người dùng

tệp đính kèm. Có thể sử dụng tối đa 10 tệp đính kèm (bao gồm cả hình ảnh) với tối đa 3. 0 MiB mỗi cái và 30. tổng cộng 0 MiB

Các giao dịch trong SQL Server được sử dụng để thực thi một tập hợp các câu lệnh SQL trong một nhóm. Với các giao dịch, tất cả các câu lệnh trong một nhóm đều thực thi hoặc không có câu lệnh nào thực thi

Trong trường hợp một trong các truy vấn trong một nhóm truy vấn được thực hiện bởi một giao dịch không thành công, tất cả các truy vấn đã thực hiện trước đó sẽ được khôi phục. Các giao dịch trong máy chủ SQL được khôi phục tự động. Tuy nhiên, với câu lệnh rollback SQL, bạn có thể rollback thủ công một giao dịch dựa trên các điều kiện nhất định

Trong bài viết này, bạn sẽ thấy giao dịch là gì và cách khôi phục giao dịch theo cách thủ công và tự động

Trước tiên, hãy tạo tập dữ liệu giả để bạn thực hành trừ khi bạn tự tin 100% rằng cơ sở dữ liệu của mình được hỗ trợ đầy đủ

Tạo cơ sở dữ liệu giả

Đoạn script sau tạo một cơ sở dữ liệu giả có tên BookStore với một bảng, tôi. e. , Sách. Bảng Sách có bốn cột. id, tên, danh mục và giá

1

2

3

4

5

6

7

8

9

10

TẠO Cơ sở dữ liệu Cửa hàng sách;

ĐI

SỬ DỤNG Cửa hàng sách;

TẠO BẢNG Sách

(

id INT,

tên VARCHAR(50) NOT NULL,

danh mục VARCHAR(50) NOT NULL,

giá INT NOT NULL

)

Bây giờ hãy thêm một số bản ghi giả trong bảng Sách

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

SỬ DỤNG Cửa hàng sách

 

CHÈN VÀO Sách

 

GIÁ TRỊ

(1, 'Book1', 'Cat1', 1800),

(2, 'Book2', 'Cat2', 1500),

(3, 'Book3', 'Cat3', 2000),

(4, 'Book4', 'Cat4', 1300),

(5, 'Book5', 'Cat5', 1500),

(6, 'Book6', 'Cat6', 5000),

(7, 'Book7', 'Cat7', 8000),

(8, 'Book8', 'Cat8', 5000),

(9, 'Book9', 'Cat9', 5400),

(10, 'Book10', 'Cat10', 3200)

Đoạn script trên thêm 10 bản ghi giả vào bảng Books

Thực hiện nhiều truy vấn mà không cần sử dụng giao dịch

Trong phần này, chúng ta sẽ thấy các vấn đề xảy ra nếu chúng ta thực hiện nhiều truy vấn trong một nhóm mà không có giao dịch. Trong phần sau, chúng ta sẽ xem cách các giao dịch có thể được sử dụng để khôi phục truy vấn SQL tự động và thủ công cũng như xử lý các vấn đề này

Nhìn vào đoạn script sau

1

2

3

4

5

6

CHÈN VÀO Sách

GIÁ TRỊ (15, 'Book15', 'Cat5', 2000)

CẬP NHẬT Sách

SET giá = '25 Trăm' WHERE< id = 15

XÓA khỏi Sách

WHERE id = 15

Trong đoạn script trên, chúng tôi thực hiện ba truy vấn. Truy vấn đầu tiên chèn một bản ghi mới trong bảng Sách có id của bản ghi là 15. Truy vấn thứ hai cập nhật giá sách với id 15. Cuối cùng, truy vấn thứ ba xóa bản ghi với id 15. Nếu bạn thực hiện truy vấn trên, bạn sẽ thấy lỗi sau

Phục hồi MySQL sau INSERT
Phục hồi MySQL sau INSERT

Lỗi này khá dễ hiểu. Nó nói rằng chúng ta không thể gán giá trị chuỗi '25 Hundred' cho cột 'id', thuộc loại số nguyên. Do đó, truy vấn thứ hai không thực hiện được. Tuy nhiên, vấn đề với tập lệnh trên là trong khi truy vấn thứ hai không thành công, truy vấn đầu tiên vẫn thực thi. Bạn có thể xác minh điều này bằng cách chọn tất cả các bản ghi từ bảng Sách, như được hiển thị bên dưới

Phục hồi MySQL sau INSERT
Phục hồi MySQL sau INSERT

Điều gì sẽ xảy ra nếu bạn thực sự muốn là nếu truy vấn thứ hai không thành công, thì truy vấn đầu tiên cũng sẽ được khôi phục để bạn quay lại trạng thái ban đầu trước khi thực hiện truy vấn?

Để đạt được điều này, bạn cần sử dụng các giao dịch

Tự động khôi phục các giao dịch SQL

Như tôi đã nói trước đó, nếu một trong các truy vấn trong một nhóm truy vấn được thực hiện bên trong một giao dịch không thành công, thì tất cả các câu lệnh SQL đã thực hiện trước đó sẽ bị khôi phục. Hãy xem cách các giao dịch có thể được sử dụng để khôi phục các truy vấn SQL

1

2

3

4

5

6

7

8

9

10

11

12

BẮT ĐẦU GIAO DỊCH

 

  CHÈN VÀO Sách

  GIÁ TRỊ (20, 'Book15', 'Cat5', 2000)

 

  CẬP NHẬT Sách

  ĐẶT giá = '25 Trăm' WHERE id = 20

 

  XÓA khỏi Sách

  WHERE id = 20

 

CAM KẾT GIAO DỊCH

Để bắt đầu một giao dịch, câu lệnh BEGIN TRANSACTION được sử dụng, theo sau là tập hợp các truy vấn mà bạn muốn thực hiện bên trong giao dịch. Để đánh dấu kết thúc một giao dịch, có thể sử dụng câu lệnh COMMIT TRANSACTION

Trong đoạn mã trên, chúng tôi thực hiện ba truy vấn SQL giống như chúng tôi đã thực hiện trong phần trước. Tuy nhiên, lần này các truy vấn đã được thực hiện bên trong một giao dịch. Một lần nữa, truy vấn đầu tiên sẽ thực hiện thành công và sẽ xảy ra lỗi khi thực hiện truy vấn thứ hai. Vì các truy vấn đang được thực thi bên trong một giao dịch, lỗi của truy vấn thứ hai sẽ khiến tất cả các truy vấn đã thực hiện trước đó bị khôi phục. Bây giờ, nếu bạn chọn tất cả các bản ghi từ bảng Sách, bạn sẽ không thấy bản ghi mới có id 20, được chèn bởi truy vấn đầu tiên bên trong giao dịch

Phục hồi thủ công các giao dịch SQL

Trong phần trước, bạn đã thấy cách các giao dịch tự động lùi lại nếu một trong các truy vấn không thể thực hiện thành công. Tuy nhiên, bạn cũng có thể muốn khôi phục truy vấn dựa trên các điều kiện nhất định. Ví dụ: bạn có thể muốn khôi phục giao dịch chèn một bản ghi vào bảng sách nếu đã tồn tại một cuốn sách có cùng tên

Trong trường hợp đó, bạn có thể sử dụng câu lệnh SQL rollback

Nhìn vào ví dụ sau

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

KHAI BÁO @Đếm sách int

 

BEGIN GIAO DỊCH AddBook

 

  CHÈN VÀO Sách

  GIÁ TRỊ (20, 'Book15', 'Cat5', 2000)

 

  SELECT @BookCount = COUNT(*) FROM Books WHERE name = 'Book15'

 

  IF @Đếm sách > 1

   BẮT ĐẦU

      QUAY LẠI GIAO DỊCH AddBook

      IN 'Đã tồn tại một cuốn sách có cùng tên'

    END

  KHÔNG

   BẮT ĐẦU

      CAM KẾT GIAO DỊCH Thêm sinh viên

      IN 'Sách mới đã được thêm thành công'

    END

Trong đoạn mã trên, chúng tôi khai báo một biến @BookCount. Tiếp theo, chúng tôi tạo một giao dịch có tên AddBook. Để tạo một giao dịch được đặt tên, bạn chỉ cần chuyển bất kỳ tên chuỗi nào cho giao dịch sau câu lệnh BEGIN TRANSACTION

Trong giao dịch, một cuốn sách có id 20 và tên Book15 được chèn vào bảng Sách. Sau đó, hàm COUNT được sử dụng để đếm các Sách có tên Book15

Nếu số lượng lớn hơn 1, điều đó có nghĩa là một cuốn sách đã tồn tại với tên Book15. Trong trường hợp này, câu lệnh SQL khôi phục được sử dụng để khôi phục giao dịch AddBook theo cách thủ công;

Bạn có thể thấy rằng cú pháp của câu lệnh SQL rollback rất đơn giản. Bạn chỉ cần viết câu lệnh ROLLBACK TRANSACTION, theo sau là tên của giao dịch mà bạn muốn rollback

Bây giờ, hãy thử chạy giao dịch AddBook để chèn bản ghi có tên là Book15 (đảm bảo rằng không có cuốn sách nào có tên này tồn tại trong bảng Sách)

Bạn sẽ thấy rằng giao dịch sẽ thực hiện thành công và thông báo sau sẽ được hiển thị cho người đọc

Phục hồi MySQL sau INSERT
Phục hồi MySQL sau INSERT

Bây giờ, hãy thử chạy lại giao dịch AddBook. Bạn sẽ thấy rằng lần này giao dịch sẽ thất bại vì một cuốn sách có tên Book15 đã tồn tại trong cơ sở dữ liệu. Do đó, giao dịch sẽ được khôi phục với thông báo sau được hiển thị cho người dùng

Phục hồi MySQL sau INSERT
Phục hồi MySQL sau INSERT

Phần kết luận

Bài viết giải thích cách rollback truy vấn SQL sử dụng giao dịch. Các truy vấn có thể được khôi phục tự động hoặc thủ công thông qua các giao dịch. Tự động khôi phục xảy ra khi một truy vấn không thực hiện được vì bất kỳ lý do gì. Phục hồi thủ công xảy ra tùy thuộc vào điều kiện do người dùng xác định. Câu lệnh rollback SQL được sử dụng để rollback các truy vấn SQL theo cách thủ công trong SQL Server

ROLLBACK có hoạt động khi chèn không?

CHÈN sẽ tự động cam kết hoặc, trong trường hợp xảy ra lỗi, khôi phục . Nếu INSERT không có trong giao dịch rõ ràng, SQL Server sẽ tự động thực hiện thao tác trong giao dịch ngầm để đảm bảo hành vi nguyên tử.

Chúng tôi có thể ROLLBACK sau khi CAM KẾT trong MySQL không?

COMMIT lưu vĩnh viễn các thay đổi được thực hiện bởi giao dịch hiện tại. ROLLBACK hoàn tác các thay đổi được thực hiện bởi giao dịch hiện tại. 2. Giao dịch không thể hoàn tác các thay đổi sau khi thực hiện CAM KẾT .

Bạn có thể ROLLBACK sau khi cam kết không?

Không thể khôi phục giao dịch sau khi câu lệnh CAM KẾT GIAO DỊCH được thực thi , trừ khi GIAO DỊCH CAM KẾT được liên kết với giao dịch lồng nhau có trong giao dịch đang được khôi phục.

Làm cách nào để ROLLBACK thay đổi trong MySQL?

rollback( conn ) đảo ngược các thay đổi được thực hiện đối với cơ sở dữ liệu bằng các hàm như sqlwrite . Hàm rollback đảo ngược tất cả các thay đổi được thực hiện kể từ thao tác CAM KẾT hoặc ROLLBACK cuối cùng. Để sử dụng chức năng này, bạn phải đặt thuộc tính AutoCommit của đối tượng kết nối thành tắt.