一.概述

  在mysql 里不同存储引擎有不同的锁,默认情况下,表锁和行锁都是自动获得的,不需要额外的命令, 有的情况下,用户需要明确地进行锁表或者进行事务的控制,以便确保整个事务的完整性。这样就需要使用事务控制和锁定语句来完成。

特点

myisam

innodb

memory

merge

ndb

事务安全

支持

锁机制

表锁

表锁

行锁(默认)

表锁

表锁

行锁

页锁(默认)

1.  lock table 和nolock tables

  lock table是锁定当前线程的表。如果当前表被锁定,其它线程想获取该表的锁时,会一直等待,直到获取到该表锁为止。
  下面演示一个获得表锁和释放表锁的简单例子,演示会话1 获取city表的read锁后,会话2更新该表记录时 会等待,当会话1 city表释放后, 会话2就会更新完成。

  --   步骤1 会话1获取city 表锁

      

  --- 步骤2  会话2更新city表一直在等待

  

  -- 步骤3  会话1 city表释放表锁

   

  ---步骤4   会话2 city表更新成功

   

2. 事务控制

  mysql 通过set autocommit, start transaction,commit 和rollback等语句支持本地事务

-- 语法如下
START TRANSACTION | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET AUTOCOMMIT = {0 | 1}

  默认mysql是自动提交事务AUTOCOMMIT的。显示事务是通过明确的commit和rollback来提交或回滚。
  START TRANSACTION 或BEGIN 语句可以开始一项新的事务。
  COMMIT 和ROLLBACK 用来提交或者回滚事务。
  CHAIN 和RELEASE 子句分别用来定义在事务提交或者回滚之后的操作,CHAIN 会立即启动一个新事物,并且和刚才的事务具有相同的隔离级别,RELEASE 则会断开和客户端的连接。
  SET AUTOCOMMIT 可以修改当前连接的提交方式,如果设置了SET AUTOCOMMIT=0,需要通过明确的命令进行提交或者回滚。

3.  start transaction  和 commit and chain 

    使用START TRANSACTION 开始的事务在commit提交后, 会自动回到 autocommit 自动提交的方式;如果在事务提交的时候使用COMMIT AND CHAIN,那么会在事务提交后立即开始一个新的事务。

会话1

会话2

查询country 表

SELECT * FROM city WHERE country ='法国';

结果为空

查询country 表

SELECT * FROM city WHERE country ='法国';

结果为空

-- 启动一个事务

START TRANSACTION;

INSERT INTO country(country, last_update) VALUES('法国',NOW());

-- 查询 仍然为空

SELECT * FROM city WHERE country ='法国';

-- 提交事务

COMMIT;

再次查询country 表

SELECT * FROM city WHERE country ='法国';

country_id        country    last_update

4          法国         2018-07-12 14:16:04

-- 重新启动一个事务

START TRANSACTION;

INSERT INTO country(country, last_update) VALUES('德国',NOW());

COMMIT AND CHAIN;

-- chain 自动开始一个新事务

INSERT INTO country(country, last_update) VALUES('日本',NOW());

查询country 表

country_id        country    last_update

2       中国         2018-07-03 18:06:45

3       美国         2018-07-12 14:15:02

4       法国         2018-07-12 14:16:04

5       德国         2018-07-12 14:21:20

-- 提交事务

COMMIT;

country_id        country    last_update

2       中国         2018-07-03 18:06:45

3       美国         2018-07-12 14:15:02

4       法国         2018-07-12 14:16:04

5       德国         2018-07-12 14:21:20

6       日本         2018-07-12 14:21:20

 

mysql 开发基础系列20 事务控制和锁定语句(上)的更多相关文章

  1. mysql 开发基础系列21 事务控制和锁定语句(下)

    1.  隐含的执行unlock tables 如果在锁表期间,用start transaction命令来开始一个新事务,会造成一个隐含的unlock tables 被执行,如下所示: 会话1 会话2 ...

  2. (1.3)mysql 事务控制和锁定语句

    (1.3)mysql 事务控制和锁定语句 lock table 参考转载自:https://www.cnblogs.com/kerrycode/p/6991502.html 关键词:mysql loc ...

  3. mysql 开发基础系列12 选择合适的数据类型(上)

    一. char 与varchar比较 在上图的最后一行的值只适用在"非严格模式",关于严格模式后面讲到.在“开发基础系列4“ 中讲到CHAR 列删除了尾部的空格.由于char是固定 ...

  4. mysql事务控制和锁定语句

    MySQL 支持对 MyISAM 和 MEMORY 存储引擎的表进行表级锁定,对 BDB 存储引擎的表进行页级锁定,对 InnoDB 存储引擎的表进行行级锁定.默认情况下,表锁和行锁都是自动获得的,不 ...

  5. mysql 开发基础系列8 表的存储引擎

    一. 表的存储引擎 1. 概述 插件式存储引擎是mysql数据库最重要的特性之一, 用户可以根据应用的需要选择如何存储和索引数据,是否使用事务等.在mysql 5.0里支持的引擎包括: MyISAM, ...

  6. mysql 开发基础系列22 SQL Model

    一.概述 与其它数据库不同,mysql 可以运行不同的sql model 下, sql model 定义了mysql应用支持的sql语法,数据校验等,这样更容易在不同的环境中使用mysql. sql ...

  7. mysql 开发基础系列18 存储过程和函数(下)

    1. 光标的使用(游标) 在存储过程和函数中可以使用光标对结果集进行循环的处理,光标使用包括光标的声明,open ,fetch,close. 下面在存储过程中使用一个光标, 这个举例中光标里的逻辑不重 ...

  8. mysql 开发基础系列17 存储过程和函数(上)

    一. 概述 存储过程和函数是事先经过编译并存储在数据库中的一段sql语句集合,可以简化应用开发人员的很多工作,减少数据在数据库与应用服务器之间的传输,提高数据处理效率是有好处的.存储过程和函数的区别在 ...

  9. mysql 开发基础系列15 索引的设计和使用

    一.概述 所有mysql 列类型都可以被索引,是提高select查询性能的最佳方法. 根据存储引擎可以定义每个表的最大索引数和最大索引长度,每种引擎对每个表至少支持16个索引,总索引长度至少为256字 ...

随机推荐

  1. gitlab简介与配置

    版本控制介绍 版本控制是指对软件开发过程中各种程序代码.配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一. 版本控制最主要的功能就是追踪文件的变更.它将什么时候.什么人更改了文件的什么 ...

  2. 如何为shell安装有道及更新pip.

    今天尝试安装shell下的有道翻译,提示需要安装pip. [root@mestery ~]# yum install python-pip [root@mestery ~]# sudo pip ins ...

  3. 关于TypeError: strptime() argument 1 must be str, not bytes解析

    关于TypeError: strptime() argument 1 must be str, not bytes解析   在使用datetime.strptime(s,fmt)来输出结果日期结果时, ...

  4. 微信小程序开发之搞懂flex布局2——flex container

    容器的概念,是用来包含其它容器(container)和项目(item). flex container——flex容器 A flexbox layout is defined using the fl ...

  5. echarts使用踩坑实录之气泡图

    最近想做一个统计文章点击率,评论率和点赞率的功能,听说echarts可以轻易完成它,于是我就选择使用echarts,考虑到我做的模块上文章是没有分类的,所以我的统计是基于一个个点,这一看嘛,感觉散点图 ...

  6. jQuery获取元素的方法

    1·$(".box").offset().left 获取盒子左边到浏览器左侧的距离(上右下相同): 2·$("span").width() 获取盒子的宽度(高度 ...

  7. flink引出的kafka不同版本的兼容性

    参考: 官网协议介绍:http://kafka.apache.org/protocol.html#The_Messages_Fetch kafka协议兼容性  http://www.cnblogs.c ...

  8. 实践中 XunSearch(讯搜)的使用教程步骤

    XunSearch(讯搜)的使用教程步骤 一.安装编译工具 yum install make gcc g++ gcc-c++ libtool autoconf automake imake mysql ...

  9. 文件上传的三种模式-Java

    文件上传的三种方式-Java 前言:因自己负责的项目(jetty内嵌启动的SpringMvc)中需要实现文件上传,而自己对java文件上传这一块未接触过,且对 Http 协议较模糊,故这次采用渐进的方 ...

  10. js 颜色选择插件

    COLPICK是一款非常的轻小,无需图片就可以实现颜色选择器的jquery插件,只用 JS 和 CSS 就实现了全部功能,而且非常直观,类似Photoshop的界面,使用方便.颜色的明暗很容易自定义, ...