探索mysql数据库Innodb下的锁机制

mysql默认配置  innodb存储引擎

CREATE TABLE `t_test` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `version` int(11) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=utf8;

启动两个session  S1 和  S2;

insert:

实验1:delete from t_test;

             ALTER TABLE `t_test` AUTO_INCREMENT = 1;

S1:    begin;

            insert into t_test set version = 1;  --> 执行成功

            select * from t_test;  --> 查出被插入的数据  id 1


S2 :   select * from t_test;      -->执行成功 无数据

            insert into t_test set version = 1;  --> 执行成功

            select * from t_test;      --> 查出 id = 2 的数据  说明S1中插入的数据没有读取到,事务的隔离性正确。

S1 :     select * from t_test;      -->查出 id = 1 的数据,说明S2中插入的数据没有读取到,事务的隔离性正确。

            commit;

            select * from t_test;      -->查出 id = 1,2 的数据,说明S2中插入的数据读取到,事务的隔离性正确。

S2:      select * from t_test;      -->查出 id = 1,2 的数据,说明S1中插入的数据读取到,事务的隔离性正确。

实验2: 

delete from t_test;

ALTER TABLE `t_test` AUTO_INCREMENT = 1;

S1:    begin;

            insert into t_test set version = 1;  --> 执行成功

            select * from t_test;  --> 查出被插入的数据  id 1


S2 :   select * from t_test;      -->执行成功 无数据

            begin;

            insert into t_test set version = 1;  --> 执行成功

            select * from t_test;      --> 查出 id = 2 的数据  说明S1中插入的数据没有读取到,事务的隔离性正确。

S1 :     select * from t_test;      -->查出 id = 1 的数据,说明S2中插入的数据没有读取到,事务的隔离性正确。

            commit;

            select * from t_test;      -->查出 id = 1 的数据,说明S2中插入的数据没读取到,事务的隔离性正确。

S2:      select * from t_test;      -->查出 id = 2 的数据,说明S1中插入的数据没读取到,事务的隔离性正确。

            rollback;  

            select * from t_test;      -->查出 id = 1的数据,说明S1中插入的数据读取到,事务的隔离性正确。

S1:      select * from t_test;      -->查出 id = 1的数据,说明S1中插入的数据读取到,事务的隔离性正确。

总结:sql的插入操作没有锁表和锁记录相关的操作。

update:实验步骤比较麻烦,不想详细记录了。这里总结一下实验结果。

1.在默认配置下,sql_safe_update=1,所以update条件中必须带有主键id,不论条件中是否还有其他的字段,都是行级锁。

2.在S1中启动事务,执行update操作,S2中update同一条记录会等待S1执行完毕之后才能继续,S2中在这之后的SQL都处于等待中。

3,.set sql_safe_update = 0,允许不根据主键id来update数据,此时mysql执行表级锁

4.由于update存在行级锁,在启动事务时要注意死锁问题。

最后:mysql autocommit = 1; 即自动提交。如果启动事务,自动提交机制会被自动屏蔽。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 12,342评论 5 116
  • 观其大纲 page 01 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 M...
    周少言阅读 8,325评论 0 33
  • 姚勇问我有没有100斤,我回答120斤。发现我的声音又大又尖又漂又不自信尾音高挑。结合昨天鹏鹏老师的讲课,找出自己...
    摇月亮阅读 876评论 0 0
  • 2017年6月6日中午11:17收到朋友连着15条信息. 哇,那个红色点点,以及那个数字:15 。 HEY,欣喜又...
    素交量场阅读 1,436评论 0 1
  • 《雪之欢歌》 是谁在天空 把亿万银花撒落 漫天飞舞 是怒放的花朵 苍茫的大地 整个银妆素裹 儿童逐雪戏 欢笑满城廓...
    路寻写作创富阅读 1,118评论 0 3