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

Tại sao MySQL khóa vị từ rõ ràng không cho phép các câu lệnh INSERT bên ngoài khóa vị từ

SELECT FOR UPDATE đang khóa từ 1 đến giá trị tiếp theo trong bảng nhân viên. Vì không có giá trị tiếp theo, nó đang khóa cho đến khi supremum pseudo-record . Bạn có thể thấy điều này trong information_schema.innodb_locks :

mysql> select * from innodb_locks;
+----------------+-------------+-----------+-----------+-------------------+------------+------------+-----------+----------+------------------------+
| lock_id        | lock_trx_id | lock_mode | lock_type | lock_table        | lock_index | lock_space | lock_page | lock_rec | lock_data              |
+----------------+-------------+-----------+-----------+-------------------+------------+------------+-----------+----------+------------------------+
| 28275:1448:3:1 | 28275       | X         | RECORD    | `test`.`employee` | PRIMARY    |       1448 |         3 |        1 | supremum pseudo-record |
| 28273:1448:3:1 | 28273       | X         | RECORD    | `test`.`employee` | PRIMARY    |       1448 |         3 |        1 | supremum pseudo-record |
+----------------+-------------+-----------+-----------+-------------------+------------+------------+-----------+----------+------------------------+
2 rows in set, 1 warning (0.00 sec)

Nếu bạn thay đổi trường hợp kiểm tra một chút để có một hàng trong nhân viên cho dept-id =2, sau đó thử và thêm một nhân viên cho dept-id =3, nó sẽ hoạt động. Ví dụ:

create table department (
    id bigint not null, 
    budget bigint not null, 
    name varchar(255), 
    primary key (id)
) ENGINE=InnoDB;

create table employee (
    id bigint not null, 
    name varchar(255), 
    salary bigint not null, 
    department_id bigint, primary key (id)
) ENGINE=InnoDB;


alter table employee 
add constraint FK_department_id 
foreign key (department_id) 
references department (id);


insert into department (name, budget, id) 
values ('Hypersistence', 100000, 1);

insert into department (name, budget, id) 
values ('Bitsystem', 10000, 2);

insert into department (name, budget, id) 
values ('XX', 10000, 3);


insert into employee (department_id, name, salary, id) 
values (1, 'John Doe 0', 30000, 0);

insert into employee (department_id, name, salary, id) 
values (1, 'John Doe 1', 30000, 1);

insert into employee (department_id, name, salary, id) 
values (2, 'John Doe 2', 30000, 2);


start transaction;

SELECT * 
FROM employee 
WHERE department_id = 1 
FOR UPDATE;


# new session

insert into employee (department_id, name, salary, id) 
values (3, 'Dave', 9000, 5)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mảng truy vấn Meta trong WordPress

  2. 'PDOException' với thông báo 'SQLSTATE [HY000] [2002] Không có đường dẫn đến máy chủ

  3. Chọn theo Tháng của một trường

  4. Cách lấy và sắp xếp các mục nhập phù hợp nhất từ ​​cơ sở dữ liệu với nhiều từ khóa Laravel 5

  5. Mysql lỗi 1236 từ chính khi đọc dữ liệu từ nhật ký nhị phân