MySQL CHỌN ĐỂ CẬP NHẬT

Dữ liệu bị khóa được dành riêng để đọc bởi phiên hiện tại. Các phiên khác có thể đọc dữ liệu bị khóa. Nhưng họ không thể ghi (cập nhật) dữ liệu bị khóa

2- Khóa ghi hoặc khóa độc quyền

Dữ liệu bị khóa được dành riêng để ghi bởi phiên hiện tại. Các phiên khác không thể đọc và ghi dữ liệu bị khóa

Các mức khóa

1- Khóa bảng. Tất cả các hàng sẽ bị khóa khi bảng bị khóa.
2- Khóa hàng. Một số hàng sẽ bị khóa trong bảng, nhưng các hàng khác sẽ không bị khóa.
3- Khóa cột. Một số cột của một hàng sẽ bị khóa nhưng các cột khác không bị khóa.

Ok, Tuyệt vời, Hãy cho tôi biết lý do, tại sao hoặc trường hợp/tình huống nào chúng ta phải sử dụng khóa đối với hàng và bàn?

Hãy lấy trường hợp sau đây mà 2 hoặc 3 hoặc. N số khách hàng muốn truy cập cùng một dữ liệu trong cùng một thời điểm và họ muốn thực hiện một số thay đổi và những thay đổi này sẽ gây ra sự khác biệt hoặc không thống nhất trong dữ liệu đó, vì vậy để tránh ghi đè/ghi đè lên công việc của nhau, chúng tôi phải hạn chế quyền truy cập vào

Kết quả là. Lý do chính để sử dụng các khóa này là để xử lý các yêu cầu đồng thời theo cách phù hợp và điều này rất quan trọng, đặc biệt khi làm việc với dữ liệu tài chính

Hãy lấy một ví dụ thực tế

Trong tài khoản ngân hàng của bạn, đây là trường hợp, số dư hiện tại của bạn. 100 đô la

1- Bạn của bạn muốn trả cho bạn 50 đô la sau khi cả hai cùng ăn trưa >> gọi đó là quá trình (X)

2- Công ty lưu trữ của bạn sẽ khấu trừ 150 đô la từ tài khoản ngân hàng của bạn dưới dạng đăng ký hàng năm >> gọi đó là quy trình (Y)

Các trường hợp để khóa hàng (có thông tin số dư của bạn) là gì?

1- Trường hợp thứ nhất. X sẽ đặt một khóa tại hàng (có thông tin số dư của bạn) trong bảng `số dư` và tiếp tục quá trình của nó >> để số dư tài khoản ngân hàng của bạn sẽ là (100+50) = 150 đô la, sau đó mở khóa

2- Trường hợp thứ hai. Y sẽ khóa ở hàng (có thông tin số dư của bạn) trong bảng `số dư` và tiếp tục quá trình của nó, nhưng đột nhiên Y thấy rằng không có đủ tiền để thanh toán (họ đang yêu cầu 150 đô la và bạn . , thì sau khi giải phóng khóa bằng quy trình Y, quy trình X sẽ đến đó và thực hiện tín dụng 50 đô la

Kết quả là. Nếu yêu cầu đầu tiên X chưa đặt khóa thì nó sẽ cho phép quy trình thứ hai Y đọc hàng và tiếp tục với quy trình của nó. và ngược lại

Làm cách nào để thực hiện khóa hàng trong MYSQL?

Có hai cách

  1. CHỌN (a,b,c,d) …. ĐỂ CẬP NHẬT.
    Bất kỳ khóa nào được đặt với `CHO CẬP NHẬT` sẽ không cho phép các giao dịch khác đọc, cập nhật hoặc xóa hàng. Giao dịch khác chỉ có thể đọc các hàng này khi giao dịch đầu tiên nhận được cam kết hoặc khôi phục.
SELECT * FROM table_name WHERE id=10 FOR UPDATE;

2) Khóa ở chế độ Chia sẻ

Bất kỳ khóa nào được đặt với `LOCK IN SHARE MODE` sẽ cho phép giao dịch khác đọc hàng bị khóa nhưng nó sẽ không cho phép giao dịch khác cập nhật hoặc xóa hàng

Trong MySQL/Innodb CHỌN KHÓA TRONG CHẾ ĐỘ CHIA SẺ và CHỌN ĐỂ CẬP NHẬT không chỉ là gợi ý. Hành vi sẽ khác với các câu lệnh CHỌN thông thường. Đây là một ví dụ đơn giản

Vỏ bọc

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

SESSION1.

mysql> bắt đầu;

Truy vấn OK, 0 hàng affected (0.00 giây)

 

mysql> chèn vào tst values(1);

Truy vấn OK, 1 hàng affected (0.00 giây)

 

SESSION2.

mysql> bắt đầu ;

Truy vấn OK, 0 hàng affected (0.00 giây)

 

mysql> chọn * từ tst;

Trống bộ (0. 01 giây)

 

# Phiên 2 không thấy bất kỳ hàng nào vì giao dịch chưa được thực hiện

 

SESSION1.

mysql> cam kết;

Truy vấn OK, 0 hàng affected (0.01 giây)

 

SESSION2.

mysql> chọn * từ tst;

Trống bộ (0. 00 giây)

 

mysql> chọn * từ tst lock in share mode;

+---+

| i .

+---+

| 1 .

+---+

1 hàng trong bộ (0.00 giây)

 

mysql> chọn * từ tst for update;

+---+

| i .

+---+

| 1 .

+---+

1 hàng trong bộ (0.00 giây)

 

#CHỌN Tiêu chuẩn không nhìn thấy các hàng trong khi CHỌN để CẬP NHẬT và KHÓA Ở CHẾ ĐỘ CHIA SẺ  thấy điều đó

Điều gì đang xảy ra? . Điều này được thực hiện vì Innodb chỉ có thể khóa phiên bản hiện tại của hàng. Hãy nghĩ về một trường hợp tương tự và hàng bị xóa. Ngay cả khi Innodb có thể đặt khóa trên các hàng không còn tồn tại nữa – liệu nó có giúp ích gì cho bạn không? . Dù sao, nó được thực hiện theo cách này vì tất cả các quyết định khác sẽ còn rắc rối hơn. Sự phức tạp này là những gì bạn phải trả cho nhiều phiên bản

Chúng ta cũng hãy nghĩ xem những công cụ sửa đổi này có thể hữu ích như thế nào và chúng ta mong đợi điều gì từ chúng trong thực tế. CHẾ ĐỘ CHIA SẺ KHÓA thực sự thường được sử dụng để bỏ qua đa phiên bản và đảm bảo rằng chúng tôi đang đọc hầu hết dữ liệu mới nhất, đồng thời để đảm bảo không thể thay đổi dữ liệu đó. Điều này, ví dụ, có thể được sử dụng để đọc tập hợp các hàng, tính toán các giá trị mới cho một số trong số chúng và viết lại chúng. Nếu chúng tôi không sử dụng LOCK IN SHARE MODE, chúng tôi có thể gặp rắc rối vì các hàng có thể được cập nhật trước khi chúng tôi ghi giá trị mới cho chúng và bản cập nhật đó có thể bị mất. Lưu ý tôi đã nói một số trong số họ. Nếu bạn muốn đọc tập hợp các hàng và sửa đổi tất cả chúng, bạn có thể chọn sử dụng CHỌN ĐỂ CẬP NHẬT. Điều này sẽ đảm bảo bạn nhận được các khóa ghi cho tất cả các hàng cùng một lúc, giúp giảm khả năng xảy ra bế tắc – khóa sẽ không cần nâng cấp khi cập nhật xảy ra. CHỌN ĐỂ CẬP NHẬT cũng chặn quyền truy cập vào dữ liệu bằng KHÓA TRONG CHẾ ĐỘ CHIA SẺ. Vì vậy, bằng cách sử dụng hai công cụ sửa đổi này, bạn có thể thực hiện hiệu quả việc vô hiệu hóa dữ liệu ngay lập tức – sử dụng CHỌN ĐỂ CẬP NHẬT để nhanh chóng khóa dữ liệu không còn chính xác nữa để dữ liệu không được sử dụng trong khi bạn tính toán lại. Lưu ý rằng nó cũng hoạt động nếu LOCK IN SHARE MODE được sử dụng với các lựa chọn - các lựa chọn tiêu chuẩn được chạy ở chế độ không khóa, có nghĩa là chúng không bao giờ khóa bất kỳ hàng nào và chỉ sử dụng các phiên bản hàng cũ nếu chúng được cập nhật

Tất cả những gì đã nói ở trên áp dụng cho chế độ REPEATABLE-READ mặc định. Với các chế độ cách ly khác nhau, có thể có một số khác biệt nhưng logic vẫn giống nhau

Vì vậy, những gợi ý này rất mạnh mẽ và hữu ích cho việc phát triển ứng dụng nhưng nên được sử dụng một cách khôn ngoan. Đừng cho rằng bạn có thể chỉ cần thêm CHỌN ĐỂ CẬP NHẬT vào lựa chọn của mình và giảm bế tắc nếu bạn đang cập nhật các hàng đã chọn. Vì kết quả truy vấn có thể có khả năng, bạn cần truy cập cách nó ảnh hưởng đến ứng dụng của bạn và thực hiện các thay đổi cần thiết

Điều còn thiếu trong khóa Innodb. ?

Khóa bảng Innodb có thể khóa các bảng nhưng nó vẫn cần đặt các khóa cấp hàng là chi phí bộ nhớ và CPU. Đối với một số hoạt động hàng loạt, sẽ hiệu quả hơn nếu sử dụng khóa bảng. Như tôi đã thử nghiệm, nó thực sự cần một số tài nguyên

Mở khóa các hàng không khớp Hãy tưởng tượng bạn đang chạy DELETE FROM USERS WHERE NAME LIKE “%Heikki%”;

Làm cách nào để sử dụng cập nhật và chọn cùng nhau trong MySQL?

Làm cách nào để CẬP NHẬT từ một lựa chọn trong MySQL? . Thứ hai, chỉ định cột nào bạn muốn cập nhật và giá trị mới trong mệnh đề SET. Thứ ba, chỉ định những hàng nào sẽ được cập nhật bằng điều kiện trong mệnh đề WHERE

Tại sao sử dụng chọn để cập nhật?

Câu lệnh CHỌN ĐỂ CẬP NHẬT được sử dụng để sắp xếp các giao dịch bằng cách kiểm soát quyền truy cập đồng thời vào một hoặc nhiều hàng của bảng . Nó hoạt động bằng cách khóa các hàng được trả về bởi một truy vấn lựa chọn, sao cho các giao dịch khác đang cố truy cập vào các hàng đó buộc phải đợi giao dịch đã khóa các hàng kết thúc.

Làm thế nào để sử dụng để cập nhật trong MySQL?

Cú pháp lệnh cập nhật MySQL . SET `column_name` = `new_value' là tên và giá trị của các trường bị ảnh hưởng bởi truy vấn cập nhật. Lưu ý, khi đặt giá trị cập nhật, kiểu dữ liệu chuỗi phải nằm trong dấu nháy đơn

Chúng tôi có thể sử dụng cập nhật và chọn dưới dạng kết hợp không?

Truy vấn con xác định một truy vấn nội bộ có thể được sử dụng bên trong câu lệnh CHỌN, CHÈN, CẬP NHẬT và XÓA. Đây là một phương pháp đơn giản để cập nhật dữ liệu bảng hiện có từ các bảng khác. Truy vấn trên sử dụng câu lệnh SELECT trong mệnh đề SET của câu lệnh UPDATE