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″;更新同一行,说明是锁行了
这里是关闭了事务自动提交,不关闭的原理也是一样的,这里是为了展示。
- 1.没有索引
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 32bit9、优化DECIMAL类型存储
假设存储数据要精确到万分之一,可以将数据乘以10000,存储到bigint里,这样可以避免DECIMAL的精度计算10、 读锁(共享锁)写锁(排他锁)
当前事务对数据加了读锁之后,别的事务可以继续加读锁,但是不能加写锁,这也就可以避免读取数据的时候会被其它事务修改,避免导致不重复读问题。
当前事务加了写锁,别的事务既不能加共享锁也不能加写锁,所以也就避免了脏写和脏读的问题。(但是可以快照读)
MySQL笔记
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...