MySQL之DDL、DML、读锁,写锁、显示锁、事务、隔离级别详解
mysql> help insert;
DDL:
DATABASE
TABLE
VIEW
DML:
SELECT
INSERT/REPLACE
UPDATE
DELETE
INSERT INTO:
第一种:
INSERT INTO tb_name [(col1, col2,...)] {VALUES|VALUE} (val1, val2,...)[,(val21,val22,...),...]
第二种:
INSERT INTO tb_name SET col1=val1, col2=val2, ...
第三种:
INSERT INTO tb_name SELECT clause
REPLACE的工作机制:与INSERT相同,除了在新插入的数据与表中的主键或惟一索引定义的数据相同会替换老的行;
UPDATE:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1=val1 [, col_name2=val2] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
UPDATE通常情况下,必须要使用WHERE子句,或者使用LIMIT限制要修改的行数;
--safe-updates
DELETE:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
TRUNCATE tb_name
explain
MySQL锁:
执行操作时施加的锁模式
读锁:共享锁
写锁:独占锁,排它锁
锁粒度:
表锁:table lock
锁定了整张表
行锁:row lock
锁定了需要的行
粒度越小,开销越大,但并发性越好;
粒度越大,开销越小,但并发性越差;
锁的实现位置:
MySQL锁:可以使用显式锁
存储引擎锁:自动进行的(隐式锁);
显式锁(表级锁):
LOCK TABLES
UNLOCK TABLES
LOCK TABLES
tbl_name lock_type
[, tbl_name lock_type] ...
锁类型:READ|WRITE
【读锁】 以后备份时可以使用这个锁[root@pc0003 ~]# mysql -p
mysql> use hellodb;
Database changed
mysql> lock tables classes read;
Query OK, 0 rows affected (0.00 sec)
【再启动一个终端2 mysql】mysql> use hellodb;
Database changed
mysql> select * from classes;
+---------+----------------+----------+
| ClassID | Class | NumOfStu |
+---------+----------------+----------+
| 1 | Shaolin Pai | 10 |
| 2 | Emei Pai | 7 |
| 3 | QingCheng Pai | 11 |
| 4 | Wudang Pai | 12 |
| 5 | Riyue Shenjiao | 31 |
| 6 | Lianshan Pai | 27 |
| 7 | Ming Jiao | 27 |
| 8 | Xiaoyao Pai | 15 |
| 9 | Liangshan | 22 |
+---------+----------------+----------+
9 rows in set (0.00 sec)
【尝试插入数据,被阻塞】mysql> insert into classes value (10,'TaoYuan',23);
【直到对方释放锁,终端2 mysql才能被执行】mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
【对方释放锁,终端2 mysql才能被执行看阻塞时间】mysql> insert into classes value (10,'TaoYuan',23);
Query OK, 1 row affected (2 min 13.29 sec)
【写锁,排他锁】mysql> lock tables classes write;
Query OK, 0 rows affected (0.00 sec)
【终端2 mysql不可读不可写】mysql> select * from classes;
【释放锁】mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
【终端2 返回数据】mysql> select * from classes;
+---------+----------------+----------+
| ClassID | Class | NumOfStu |
+---------+----------------+----------+
| 1 | Shaolin Pai | 10 |
| 2 | Emei Pai | 7 |
|