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会锁行