Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tránh khóa chết bằng cách ra lệnh rõ ràng

Mặc dù bạn có thể làm điều đó thông qua Straight_join, bạn cũng có thể nhận được khóa rõ ràng trên các hàng bạn muốn bằng cách sao chép lựa chọn ... để cập nhật cho hàng mà bạn muốn nhận trước.

CREATE TEMPORARY TABLE colorsToUpdate (
     colorID BIGINT(20) NOT NULL, 
     modelID BIGINT(20) NOT NULL
);

insert into colorsToUpdate ( colorID, modelID)
SELECT  id, model_id
FROM    colors
where id in (101, 105, 106);

#This will try to acquire lock on models
select m.* from models m
join colorsToUpdate c
on c.modelID = m.id
for UPDATE;

#this will try to get locks on models, and colors.
select m.*, c.*
from colorsToUpdate u
left join models m
on u.modelID = m.id
join colors c 
on u.colorID = c.ID
order by m.id asc, c.id asc
for update;

# do your data modification here.

drop table colorsToUpdate;

Vì quá trình khóa được thực hiện theo nhiều bước nên các mục nhập trong 'màu' của bảng có thể được sửa đổi giữa khi bạn thiết lập bảng tạm thời và khi bạn hoàn thành việc lấy khóa trên hai bảng.

Điều đó có thể ổn đối với bạn (tức là nếu bạn chỉ muốn sửa đổi các mục nhập hiện có, khi giao dịch bắt đầu) nhưng có thể gây ra các lỗi nhỏ nếu đó không phải là điều bạn muốn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng mysqldump để sao lưu MySQL hoặc MariaDB

  2. Gặp lỗi Kết hợp bất hợp pháp các đối chiếu (utf8mb4_unicode_ci, IMPLICIT) và (utf8mb4_general_ci, IMPLICIT) cho hoạt động '='

  3. Thiết kế cơ sở dữ liệu Mysql cho khách hàng nhiều địa chỉ và địa chỉ mặc định

  4. Hàm xác định trong mysql

  5. Bộ đếm tăng số CHỌN trong MySQL