mysql 开发基础系列20 事务控制和锁定语句(上)
一.概述
在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 事务控制和锁定语句(上)的更多相关文章
- mysql 开发基础系列21 事务控制和锁定语句(下)
1. 隐含的执行unlock tables 如果在锁表期间,用start transaction命令来开始一个新事务,会造成一个隐含的unlock tables 被执行,如下所示: 会话1 会话2 ...
- (1.3)mysql 事务控制和锁定语句
(1.3)mysql 事务控制和锁定语句 lock table 参考转载自:https://www.cnblogs.com/kerrycode/p/6991502.html 关键词:mysql loc ...
- mysql 开发基础系列12 选择合适的数据类型(上)
一. char 与varchar比较 在上图的最后一行的值只适用在"非严格模式",关于严格模式后面讲到.在“开发基础系列4“ 中讲到CHAR 列删除了尾部的空格.由于char是固定 ...
- mysql事务控制和锁定语句
MySQL 支持对 MyISAM 和 MEMORY 存储引擎的表进行表级锁定,对 BDB 存储引擎的表进行页级锁定,对 InnoDB 存储引擎的表进行行级锁定.默认情况下,表锁和行锁都是自动获得的,不 ...
- mysql 开发基础系列8 表的存储引擎
一. 表的存储引擎 1. 概述 插件式存储引擎是mysql数据库最重要的特性之一, 用户可以根据应用的需要选择如何存储和索引数据,是否使用事务等.在mysql 5.0里支持的引擎包括: MyISAM, ...
- mysql 开发基础系列22 SQL Model
一.概述 与其它数据库不同,mysql 可以运行不同的sql model 下, sql model 定义了mysql应用支持的sql语法,数据校验等,这样更容易在不同的环境中使用mysql. sql ...
- mysql 开发基础系列18 存储过程和函数(下)
1. 光标的使用(游标) 在存储过程和函数中可以使用光标对结果集进行循环的处理,光标使用包括光标的声明,open ,fetch,close. 下面在存储过程中使用一个光标, 这个举例中光标里的逻辑不重 ...
- mysql 开发基础系列17 存储过程和函数(上)
一. 概述 存储过程和函数是事先经过编译并存储在数据库中的一段sql语句集合,可以简化应用开发人员的很多工作,减少数据在数据库与应用服务器之间的传输,提高数据处理效率是有好处的.存储过程和函数的区别在 ...
- mysql 开发基础系列15 索引的设计和使用
一.概述 所有mysql 列类型都可以被索引,是提高select查询性能的最佳方法. 根据存储引擎可以定义每个表的最大索引数和最大索引长度,每种引擎对每个表至少支持16个索引,总索引长度至少为256字 ...
随机推荐
- win10下使用powershell来获取文件MD5的命令
Get-FileHash 文件路径 -Algorithm MD5| Format-List
- 重置表单中的文件上传控件(file input)的方法
方法一: 调用所在 form 表单的 reset 方法,这个方法的缺点是会把整个表单重置,需要存储表单的状态,再回填回去 方法二: 使用jQuery,代码为: $("#id").r ...
- lock(this)
public void test(int i) { lock(this) { if (i > 10) { i--; test(i); } } } 网上答案说和参数有关.可是我把int 改成ob ...
- 解决Xcode8模拟器无法删除应用的问题
关闭模拟器的3DTouch.Hardware →Touch Pressure→Use Trackpad Force.
- windows环境下wamp安装redis拓展
环境: wamp集成环境 安装分为两部 1.安装redis客户端 https://github.com/ServiceStack/redis-windows/raw/master/download ...
- java多线程中注入Spring对象问题
web应用中java多线程并发处理业务时,容易抛出NullPointerException. 原因: 线程中的Spring Bean没有被注入.web容器在启动时,没有提前将线程中的bean注入,在线 ...
- ubuntu18.04静态ip设置
1.配置文件 vi /etc/netplan/-cloud-init.yaml network: ethernets: enp129s0f0: addresses: [] dhcp4: true op ...
- 2019.03.28 bzoj3598: [Scoi2014]方伯伯的商场之旅(带权中位数+数位dp)
传送门 题意咕咕咕自己读吧挺简单的 思路: 由带权中位数的性质可以得到对于每个数放在每个二进制位的代价一定是个单调或者单峰函数,因此我们先把所有的数都挪到第一个位置,然后依次向右枚举峰点(极值点)把能 ...
- appium:运行脚本时,报404的解决办法
对于报404的错,不要怀疑,在环境正常的情况下,一定是你的端口被占用了. 就用:查看端口:netstat -aon|findstr 5037 查看进程:tasklist /fi "PID e ...
- ASP.NET代码调用SQL Server带DateTime类型参数的存储过程抛出异常问题
ASP.NET代码调用SQL Server带DateTime类型参数的存储过程,如果DateTime类型参数的值是'0001/1/1 0:00:00'时,就会抛出异常“Message: SqlDate ...