-
1、事务的理解 如果不显式的开启一个事务那么每一个查询都被当作一个事务执行(事务默认自动提交),如果不开启事务自动提交,那么所有查询都会在一个事务中 所以可以理解为对数据update 操作的时候是加了行锁的
-
2、行锁理解
select * from table where id<10 and id>2 for update通过索引先扫描过滤数据,扫描了多少数据就给哪些行加行锁 -
3、执行计划using where理解 服务器层使用了where条件进行过滤,但是这个条件不是索引
-
4、行锁隐式锁定/显式锁定
- 显示锁定
select * from table lock in share mode;select * from table for update; - 隐式锁定 开启事务之后根据隔离级别随时可能锁定,commit/rollback 解锁
- 显示锁定
-
5、 MySQL执行update 操作加锁情况分析 示例sql:
update tb_user set phone=11 where name=”c1″- 1.没有索引 运行命令:begin;开启事务,然后运行命令:update tb_user set phone=11 where name=”c1″;修改,先别commit事务。 再开一个窗口,直接运行命令:update tb_user set phone=22 where name=“c2”;会发现命令卡住了,但是当前面一个事务通过commit提交了,命令就会正常运行结束,说明是被锁表了。
- 2.给name字段加索引 然后继续如1里面的操作,也就是一个开启事务,运行update tb_user set phone=11 where name=”c1″;先不提交 然后另一个运行update tb_user set phone=22 where name=”c2″;发现命令不会卡住,说明没有锁表 但是如果另一个也是update tb_user set phone=22 where name=”c1″;更新同一行,说明是锁行了 这里是关闭了事务自动提交,不关闭的原理也是一样的,这里是为了展示。
-
6、单个update执行是否是事务 是
-
7、关于MySQL事务自动提交
- 值为 0 和值为 OFF:关闭事务自动提交。如果关闭自动提交,用户将会一直处于某个事务中,只有提交或回滚后才会结束当前事务,重新开始一个新事务。
- 值为 1 和值为 ON:开启事务自动提交。如果开启自动提交,则每执行一条 SQL 语句,事务都会提交一次。 使用 BEGIN 或 START TRANSACTION 开启一个事务之后,自动提交将保持禁用状态,直到使用 COMMIT 或 ROLLBACK 结束事务。之后,自动提交模式会恢复到之前的状态
-
8、INT(1)和INT(8)占用空间大小一样吗? 一样,括号里的数只是规定了MySQL的一些交互工具用来显示字符的个数。而实际占用空间是和数据类型有关的TINYINT 1byte 即 8bit SMALLINT 2byte即16bit ,INT 4byte 32bit
-
9、优化DECIMAL类型存储 假设存储数据要精确到万分之一,可以将数据乘以10000,存储到bigint里,这样可以避免DECIMAL的精度计算
-
10、 读锁(共享锁)写锁(排他锁) 当前事务对数据加了读锁之后,别的事务可以继续加读锁,但是不能加写锁,这也就可以避免读取数据的时候会被其它事务修改,避免导致不重复读问题。 当前事务加了写锁,别的事务既不能加共享锁也不能加写锁,所以也就避免了脏写和脏读的问题。(但是可以快照读)