1 查询数据库自动提交设置方式
select @@autocommit – 查询数据库是否是自动提交的 结果1(true)为自动提交,结果0(false)为不自动提交

2 SET AUTOCOMMIT = 0; – 设置数据库提交方式为不自动提交
再次查询 select @@autocommit

3 创建表 tb_user
CREATE TABLE `tb_user` ( -- 创建表
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL,
`phone` varchar(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

4 插入两条数据

下面有两个测试,name字段有索引和无索引情况
测试1 name字段没有索引
步骤1
begin;
update tb_user set phone=111 where name="a";
刷新数据库:没有执行commit语句,数据库数据没有变

步骤2
begin;
update tb_user set phone=222 where name="b";

因为步骤1 已经把表锁住了,所以步骤2 的sql卡住,不能执行,数据库数据不变

步骤3 步骤1接着执行commit;

刷新数据库

步骤1 执行完成,步骤2没有执行commit,所以数据没有变
步骤4
步骤2继续执行commit;


结论:如果没有索引,update会锁表
测试2 name字段加索引
加索引
create index index_name on tb_user(name);
查索引
show INDEX from tb_user;

重置数据库数据

步骤1
begin;
update tb_user set phone=111 where name="a";

刷新数据库

步骤2
begin;
update tb_user set phone=222 where name="b";

刷新数据库

发现表并没有被锁住
如果执行下面的代码,则发现行被锁定了
begin;
update tb_user set phone=222 where name="a";

步骤1执行commit;
步骤2执行commit;
刷新数据库

结论:如果没索引,update会锁行
数据库自动提交与索引锁定
本文探讨了数据库自动提交设置及其对数据操作的影响,并通过具体测试案例对比了有无索引情况下,更新操作对数据库锁定行为的不同。实验表明,无索引时更新操作会锁表,而有索引则会锁行。

被折叠的 条评论
为什么被折叠?



