目录
四、mysql 中 myisam 与 innodb 的区别?
一、锁的概念:
- 锁是计算机协调多个进程或线程并发访问某一资源的机制。
- 在数据库中,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、 有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个 重要因素。
- 锁对数据库而言显得尤其重要,也更加复杂。
二、MyISAM 锁:
读锁,对 MyISAM 表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一 表的写请求
读锁,对 MyISAM 表的读操作,不会阻塞当前 session 对表读,当对表进行修改会报错
读锁,一个 session 使用 LOCKTABLE 命令给表 f 加了读锁,这个 session 可以查询锁定表 中的记录,但更新或访问其他表都会提示错误;
写锁,对 MyISAM 表的写操作,则会阻塞其他用户对同一表的读和写操作;
写锁,对 MyISAM 表的写操作,当前 session 可以对本表做 CRUD,但对其他表进行操作 会报错。
2.1 共享读锁
语法:lock table 表名 read
2.2 独占写锁
语法:lock table 表名 write
2.3 解锁——MyISAM
语法:unlock tables 或者 begin
三、InnoDB 锁:
在 mysql 的 InnoDB 引擎支持行锁。
共享锁又称:读锁。当一个事务对某几行上读锁时,允许其他事务对这几行进行读操作,但 不允许其进行写操作,也不允许其他事务给这几行上排它锁,但允许上读锁。
排它锁又称:写锁。当一个事务对某几个上写锁时,不允许其他事务写,但允许读。更不允 许其他事务给这几行上任何锁。包括写锁。
3.1 共享锁
语法:lock in shate mode
例:select * from 表名 where 条件 lock in share mode;
3.2 排他锁
语法:for update
例:select * from 表名 where 条件 for update
注意:
1.两个事务不能锁同一个索引。
2.insert ,delete , update 在事务中都会自动默认加上排它锁。
3.行锁必须有索引才能实现,否则会自动锁全表,那么就不是行锁了。
3.3 解锁——InnoDB
语法:begin、commit 或者 rollback
四、mysql 中 myisam 与 innodb 的区别?
4.1 MyISAM:强调的是性能,每次查询具有原子性,其执行数 度比 InnoDB 类型更快,但是不提供事务支持;
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚 (rollback)和崩溃修复能力(crash recovery capabilities)的事务安全 (transaction-safe (ACID compliant))型表;
4.2 MyISAM 支持表级锁, InnoDB 支持行级锁;
4.3 InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败.
查看哪些语句被阻塞了:
1、select * from sys.innodb_lock_waits 注意:只有MySql 5.7版本才有
2、通用写法:
SELECT
r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_thread,
r.trx_query waiting_query,
b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_thread
FROM
information_schema.innodb_lock_waits w
INNER JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
INNER JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id
3、查看MySQL当前默认的存储引擎
-- 查看MySQL当前默认的存储引擎
show variables like'%storage_engine%';
4、 查看某张表的存储引擎
-- 查看某张表的存储引擎
show create table 表名 ;
5、查看MySql的隔离级别:mysql 默认的事务隔离级别为 repeatable-read(可重复读)
-- 查看MySql的隔离级别:mysql 默认的事务隔离级别为 repeatable-read(可重复读)
show variables like'%tx_isolation%';