| session_1 | session_2 |
|
mysql> lock table emp write; Query OK, 0 rows affected (0.00 sec) |
|
|
mysql> select * from emp; +------+-------+----------+ | id | ename | store_id | +------+-------+----------+ | 111 | dhy | 111 | | 111 | dhy | 112 | | 111 | dhy | 113 | +------+-------+----------+ 3 rows in set (0.00 sec) mysql> insert into emp values(111,'dhy',111); Query OK, 1 row affected (0.01 sec) |
mysql> select * from emp; 等待 |
|
mysql> unlock tables; Query OK, 0 rows affected (0.00 sec) |
mysql> select * from emp; +------+-------+----------+ | id | ename | store_id | +------+-------+----------+ | 111 | dhy | 111 | | 111 | dhy | 111 | | 111 | dhy | 112 | | 111 | dhy | 113 | +------+-------+----------+ 4 rows in set (1 min 39.47 sec) |
| session_1 | session_1 |
|
mysql> lock table emp read; Query OK, 0 rows affected (0.00 sec) |
|
|
mysql> select * from emp; +------+-------+----------+ | id | ename | store_id | +------+-------+----------+ | 111 | dhy | 111 | | 111 | dhy | 111 | | 111 | dhy | 112 | | 111 | dhy | 113 | +------+-------+----------+ 4 rows in set (0.00 sec) |
mysql> select * from emp; +------+-------+----------+ | id | ename | store_id | +------+-------+----------+ | 111 | dhy | 111 | | 111 | dhy | 111 | | 111 | dhy | 112 | | 111 | dhy | 113 | +------+-------+----------+ 4 rows in set (0.00 sec) |
|
mysql> select * from test; ERROR 1100 (HY000): Table 'test' was not locked with LOCK TABLES |
mysql> select * from test; +-----+ | id | +-----+ | 111 | +-----+ 1 row in set (0.00 sec) |
|
mysql> insert into emp values(111,'dhy',123); ERROR 1099 (HY000): Table 'emp' was locked with a READ lock and can't be updated |
mysql> insert into emp values(111,'dhy',123); 等待。。。。。。。 |
|
mysql> unlock tables; Query OK, 0 rows affected (0.00 sec) |
mysql> insert into emp values(111,'dhy',123); Query OK, 1 row affected (35.66 sec) |
| session_1 | session_2 |
|
mysql> lock table emp read local; Query OK, 0 rows affected (0.00 sec) |
|
|
mysql> insert into emp values(111,'dhy',123); ERROR 1099 (HY000): Table 'emp' was locked with a READ lock and can't be updated |
mysql> insert into emp values(111,'dhy',124); Query OK, 1 row affected (0.00 sec) mysql> update emp set ename = 'core' where store_id='124'; 等待..... |
|
mysql> select * from emp; +------+-------+----------+ | id | ename | store_id | +------+-------+----------+ | 111 | dhy | 111 | | 111 | dhy | 111 | | 111 | dhy | 112 | | 111 | dhy | 113 | | 111 | dhy | 123 | | 111 | dhy | 123 | +------+-------+----------+ 6 rows in set (0.00 sec) 访问不到新插入数据 |
|
|
mysql> unlock tables; Query OK, 0 rows affected (0.00 sec) |
mysql> update emp set ename = 'core' where store_id='124'; Query OK, 1 row affected (39.43 sec) Rows matched: 1 Changed: 1 Warnings: 0 |
|
mysql> select * from emp; +------+-------+----------+ | id | ename | store_id | +------+-------+----------+ | 111 | dhy | 111 | | 111 | dhy | 111 | | 111 | dhy | 112 | | 111 | dhy | 113 | | 111 | dhy | 123 | | 111 | dhy | 123 | | 111 | dhy | 123 | | 111 | core | 124 | +------+-------+----------+ 8 rows in set (0.00 sec) |
|
| session_1 | session_2 |
|
mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> select actor_id,first_name, last_name from actor where actor_id = 178; +----------+------------+-----------+ | actor_id | first_name | last_name | +----------+------------+-----------+ | 178 | LISA | MONROE | +----------+------------+-----------+ 1 row in set (0.00 sec) |
mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> select actor_id,first_name, last_name from actor where actor_id = 178; +----------+------------+-----------+ | actor_id | first_name | last_name | +----------+------------+-----------+ | 178 | LISA | MONROE | +----------+------------+-----------+ 1 row in set (0.00 sec) |
|
mysql> select actor_id,first_name, last_name from actor where actor_id = 178 lock in share mode ; +----------+------------+-----------+ | actor_id | first_name | last_name | +----------+------------+-----------+ | 178 | LISA | MONROE | +----------+------------+-----------+ 1 row in set (0.00 sec) |
|
|
|
别的session 可以查询并加共享锁 mysql> select actor_id,first_name, last_name from actor where actor_id = 178 lock in share mode ; +----------+------------+-----------+ | actor_id | first_name | last_name | +----------+------------+-----------+ | 178 | LISA | MONROE | +----------+------------+-----------+ 1 row in set (0.00 sec) |
|
mysql> update actor set last_name = 'MONROE T' where actor_id = 178; 等待...... |
|
|
|
别的进程更新就会死锁退出 mysql> update actor set last_name = 'MONROE T' where actor_id = 178; ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction |
|
mysql> update actor set last_name = 'MONROE T' where actor_id = 178; Query OK, 1 row affected (40.24 sec) Rows matched: 1 Changed: 1 Warnings: 0 |
|
| session_1 | session_2 |
|
mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> select actor_id,first_name, last_name from actor where actor_id = 178; +----------+------------+-----------+ | actor_id | first_name | last_name | +----------+------------+-----------+ | 178 | LISA | MONROE T | +----------+------------+-----------+ 1 row in set (0.00 sec) |
mysql> set autocommit = 0; Query OK, 0 rows affected (0.00 sec) mysql> select actor_id,first_name, last_name from actor where actor_id = 178; +----------+------------+-----------+ | actor_id | first_name | last_name | +----------+------------+-----------+ | 178 | LISA | MONROE | +----------+------------+-----------+ 1 row in set (0.00 sec) |
|
添加加排它锁 mysql> select actor_id,first_name, last_name from actor where actor_id = 178 for update; +----------+------------+-----------+ | actor_id | first_name | last_name | +----------+------------+-----------+ | 178 | LISA | MONROE T | +----------+------------+-----------+ 1 row in set (0.00 sec) |
别的session 可以查询该记录,但是不能添加排它锁和排它锁,会等待获得锁 mysql> select actor_id,first_name, last_name from actor where actor_id = 178; +----------+------------+-----------+ | actor_id | first_name | last_name | +----------+------------+-----------+ | 178 | LISA | MONROE | +----------+------------+-----------+ 1 row in set (0.00 sec) mysql> select actor_id,first_name, last_name from actor where actor_id = 178 for update; .....等待 |
|
当前session对锁定的记录进行更新操作,更新后释放锁 mysql> update actor set last_name = 'MONROE T' where actor_id = 178; Query OK, 0 rows affected (0.00 sec) Rows matched: 1 Changed: 0 Warnings: 0 mysql> commit; Query OK, 0 rows affected (0.00 sec) |
|
|
|
其它进程获得锁 mysql> select actor_id,first_name, last_name from actor where actor_id = 178 for update; +----------+------------+-----------+ | actor_id | first_name | last_name | +----------+------------+-----------+ | 178 | LISA | MONROE T | +----------+------------+-----------+ 1 row in set (8.80 sec) |
| session_1 | session_1 |
|
mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> select * from tab_no_index where id=1; +------+------+ | id | name | +------+------+ | 1 | 1 | +------+------+ 1 row in set (0.00 sec) |
mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> select * from tab_no_index where id =2; +------+------+ | id | name | +------+------+ | 2 | 2 | +------+------+ 1 row in set (0.00 sec) |
|
mysql> select * from tab_no_index where id = 1 for update; +------+------+ | id | name | +------+------+ | 1 | 1 | +------+------+ 1 row in set (0.00 sec) |
|
|
|
mysql> select * from tab_no_index where id = 2 for update; +------+------+ | id | name | +------+------+ | 2 | 2 | +------+------+ .....等待 |
| session_1 | session_2 |
|
mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> select * from tab_with_index where id =1; +------+------+ | id | name | +------+------+ | 1 | 1 | +------+------+ 1 row in set (0.00 sec) |
mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> select * from tab_with_index where id = 2; +------+------+ | id | name | +------+------+ | 2 | 2 | +------+------+ 1 row in set (0.00 sec) |
|
mysql> select * from tab_with_index where id =1 for update; +------+------+ | id | name | +------+------+ | 1 | 1 | +------+------+ 1 row in set (0.00 sec) |
|
|
|
mysql> select * from tab_with_index where id = 2 for update; +------+------+ | id | name | +------+------+ | 2 | 2 | +------+------+ 1 row in set (0.00 sec) |
| session_1 | session_2 |
|
mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set (0.00 sec) mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) |
mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set (0.00 sec) mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) |
|
mysql> select * from emp1 where id > 4 for update -> ; +------+ | id | +------+ | 5 | +------+ 1 row in set (0.00 sec) |
|
|
|
插入不存在的数据会出现等待 mysql> insert into emp1 values(6); .....等待 |
|
mysql> rollback; Query OK, 0 rows affected (0.00 sec) |
|
|
|
mysql> insert into emp1 values(6); Query OK, 1 row affected (50.28 sec) |
| session_1 | session_2 |
|
mysql> set autocommit = 0; Query OK, 0 rows affected (0.00 sec) mysql> select * from emp; Empty set (0.00 sec) mysql> select * from emp1; +------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | | 5 | +------+ 5 rows in set (0.00 sec) |
mysql> set autocommit = 0; Query OK, 0 rows affected (0.00 sec) mysql> select * from emp; Empty set (0.00 sec) mysql> select * from emp1; +------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | | 5 | +------+ 5 rows in set (0.00 sec) |
|
mysql> insert into emp select * from emp1; Query OK, 5 rows affected (0.01 sec) Records: 5 Duplicates: 0 Warnings: 0 |
|
|
|
mysql> update emp1 set id = '12' where id = '2'; .....等待 |
|
mysql> commit; Query OK, 0 rows affected (0.00 sec) |
|
|
|
mysql> update emp1 set id = '12' where id = '2'; Query OK, 0 rows affected (44.37 sec) Rows matched: 0 Changed: 0 Warnings: 0 |
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30024909/viewspace-1395173/ ,如需转载,请注明出处,否则将追究法律责任。