哪些引擎支持数据库事务?

 

mysql 锁级别

1. 表级锁 : 开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高 , 并发度最低。

2. 行级锁 : 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低 , 并发度也最高。

3. 页面锁 : 开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

sql 测试代码 

CREATE TABLE `t_customer` (
  `id` INT(20) NOT NULL AUTO_INCREMENT,
  `cname` VARCHAR(50) NOT NULL,
  `age` INT(10) NOT NULL,
  `phone` VARCHAR(20) NOT NULL,
  `sex` TINYINT(4) NOT NULL,
  `birth` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
 
 
INSERT INTO t_customer(cname,age,phone,sex,birth) VALUES('z3',22,'13811112222',1,NOW());
INSERT INTO t_customer(cname,age,phone,sex,birth) VALUES('z4',24,'13811112223',0,NOW());
INSERT INTO t_customer(cname,age,phone,sex,birth) VALUES('z5',25,'13811112224',1,NOW());
 
SELECT * FROM t_customer;
 
create index idx_cname on  t_customer(cname);

案例 1

1. 开启事务 , 更改表中的电话为 xxx 的 age 字段 , 注意此时 phone 字段还没有创建索引 , 也没有回滚事务或者提交事务 ( 无 rollback 和 commit 意为 : 没有释放锁 )

2. phone 字段上面没有创建索引 , 开启事务 , 无提交 , 行锁变表锁

3. 当其他客户端也进行表数据的更改时 , 虽然更改的是其他的数据行 , 但是由于整个表被锁了 , 也会导致无法成功修改 , 处于一直执行的状态 , 转圈圈 , 直到前一个客户端提交事务 , 释放锁 , 才可成功的执行

原因 :

1. 索引没命中 ( 某字段 , 我没有创建它的索引 , 但是呢 , 我却用到了此字段作为条件进行查询等操作 ) ,变成表锁 , 没有使用到索引

2. 索引命中了就是行锁 , 我即使锁的是A记录 , 你操作的是B记录 , 因为是锁的是行 , 之间并不会相互影响

mysql 什么情况下会出现行锁 什么情况下出现表锁 mysql innodb什么时候会锁表_加锁

 

案例 2

索引命中,行锁 ( 创建了索引 , 并且使用到了索引就是命中索引 , 命中索引 , 开启事务, 锁的就是行 )

id 主键索引 + 聚簇索引 + 一级索引

mysql 什么情况下会出现行锁 什么情况下出现表锁 mysql innodb什么时候会锁表_字段_02

mysql 什么情况下会出现行锁 什么情况下出现表锁 mysql innodb什么时候会锁表_死锁_03

辅助索引的意思就是 : 非主键索引外的索引

总结

1. InnoDB 的行锁,是通过锁住索引来实现的,如果加锁查询的时候没有使用到索引,会将整个聚簇索引都锁住,相当于锁住了整张表。


2. 就是说 : 命中索引就锁行,没有命中就锁表 ( 问题会扩大化,小心 )