Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengapa penguncian predikat eksplisit MySQL melarang pernyataan INSERT di luar kunci predikat?

SELECT FOR UPDATE mengunci antara 1 dan nilai berikutnya dalam tabel karyawan. Karena tidak ada nilai berikutnya, itu terkunci hingga supremum pseudo-record . Ini bisa dilihat di 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)

Jika Anda mengubah kasus uji sedikit sehingga ada baris karyawan untuk dept-id=2, dan kemudian mencoba dan menambahkan karyawan untuk dept-id=3, itu akan berhasil. Contoh:

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. Optimalkan kueri peringkat lambat

  2. Bisakah saya membuat objek data Squeryl secara otomatis untuk mencerminkan skema MySql yang ada?

  3. Bagaimana Membandingkan Dua Kolom di MySQL

  4. Mysql:urutkan secara acak daripada urutkan berdasarkan kolom tertentu

  5. Permintaan MySQL untuk menampilkan catatan dengan tanggal saat ini di atas dan lainnya sesuai urutan menurun