MySQL具体解释(14)----------事务处理
前言:前一篇文章关于事务处理的博文没有写清楚,读起来非常晦涩。非常难理解,所以有整理了一些资料,帮助理解。见谅!
关于MySQL事务处理学习记
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}
START TRANSACTION或BEGIN语句能够開始一项新的事务。
COMMIT能够提交当前事务。是变更成为永久变更。
ROLLBACK能够 回滚当前事务,取消其变更。
SET AUTOCOMMIT语句能够禁用或启用默认的autocommit模式,用于当前连接。
自选的WORK关键词被支持。用于COMMIT和RELEASE。与CHAIN和RELEASE子句。
CHAIN和RELEASE能够被用于对事务完毕进行附加控制。
Completion_type系统变量的值决定了默认完毕的性质。
AND CHAIN子句会在当前事务结束时。立马启动一个新事务。而且新事务与刚结束的事务有同样的隔离等级。
RELEASE子句在终止了当前事务后。会让server断开与当前client的连接。包括NO关键词能够抑制CHAIN或RELEASE完毕。
假设completion_type系统变量被设置为一定的值。使连锁或释放完毕能够默认进行,此时NO关键词实用。
默认情况下,MySQL採用autocommit模式执行。这意味着。当您执行一个用于更新(改动)表的语句之后。MySQL立马把更新存储到磁盘中。
假设您正在使用一个事务安全型的存储引擎(如InnoDB, BDB或NDB簇)。则您能够使用下面语句禁用autocommit模式:
SET AUTOCOMMIT=0; 通过把AUTOCOMMIT变量设置为零。禁用autocommit模式之后。您必须使用COMMIT把变更存储到磁盘中。或着假设您想要忽略从事务開始进行以来做出的变更。使用ROLLBACK。
假设您想要对于一个单一系列的语句禁用autocommit模式。则您能够使用START TRANSACTION语句:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1; COMMIT;
使用START TRANSACTION,autocommit仍然被禁用,直到您使用COMMIT或ROLLBACK结束事务为止。
然后autocommit模式恢复到原来的状态。
BEGIN和BEGIN WORK被作为START TRANSACTION的别名受到支持,用于对事务进行初始化。
START TRANSACTION是标准的SQL语法。而且是启动一个ad-hoc事务的推荐方法。
BEGIN语句与BEGIN关键词的使用不同。BEGIN关键词能够启动一个BEGIN...END复合语句。后者不会開始一项事务。
您也能够依照例如以下方法開始一项事务:
START TRANSACTION WITH CONSISTENT SNAPSHOT;
WITH CONSISTENT SNAPSHOT子句用于启动一个一致的读取。用于具有此类功能的存储引擎。
眼下,该子句仅仅适用于InnoDB。该子句的效果与公布一个START TRANSACTION,后面跟一个来自不论什么InnoDB表的SELECT的效果一样。
開始一项事务会造成一个隐含的UNLOCK TABLES被运行。
为了获得最好的结果,事务应仅仅使用由单一事务存储引擎管理的表运行。
否则,会出现下面问题:
假设您使用的表来自多个事务安全型存储引擎(比如InnoDB和BDB)。而且事务隔离等级不是SERIALIZABLE,则有可能当一个事务提交时。其他正在进行中的、使用相同的表的事务将仅仅会发生由第一个事务产生的变更。
也就是。用混合引擎不能保证事务的原子性。并会造成不一致。(假设混合引擎事务不常常有,则您能够依据须要使用
SET TRANSACTION ISOLATION LEVEL把隔离等级设置到SERIALIZABLE。)
假设您在事务中使用非事务安全型表,则对这些表的不论什么变更被立马存储,不论autocommit模式的状态怎样。
假设您在更新了事务中一个事务表之后。公布一个ROLLBACK语句,则会出现一个ER_WARNING_NOT_COMPLETE_ROLLBACK警告。
对事务安全型表的变更被 回滚,可是对非事务安全型表没有变更。
每一个事务被存储在一个组块中的二进制日志中,在COMMIT之上。被回滚的事务不被计入日志。(例外情况:对非事务表的更改不会被 回滚。假设一个被回滚的事务包含对非事务表的更改,则整个事务使用一个在末端的ROLLBACK语句计入日志,以确保对这些表的更改进行复制。)
您能够使用SET TRANSACTION ISOLATION LEVEL更改事务的隔离等级。
回滚能够慢速执行。在用户没有明白要求时,也能够进行回滚(比如。当发生错误时)。因此,在明白地和隐含的(ROLLBACK SQL命令)回滚时。SHOW PROCESSLIST会在Stage列中显示Rolling back。用于连接。
事务处理和并发性
1.1. 基础知识和相关概念
1 )所有的表类型都能够使用锁。可是仅仅有 InnoDB 和 BDB 才有内置的事务功能。
2 )使用 begin 開始事务,使用 commit 结束事务。中间能够使用 rollback 回滚事务。
3 )在默认情况下, InnoDB 表支持一致读。
SQL 标准中定义了 4 个隔离级别: read uncommited 。 read commited , repeatable read 。 serializable 。
read uncommited 即脏读。一个事务改动了一行。还有一个事务也能够读到该行。
假设第一个事务运行了回滚,那么第二个事务读取的就是从来没有正式出现过的值。
?
read commited 即一致读。试图通过仅仅读取提交的值的方式来解决脏读的问题,可是这又引起了不可反复读取的问题。
一个事务运行一个查询。读取了大量的数据行。
在它结束读取之前,还有一个事务可能完毕了对数据行的更改。当第一个事务试图再次运行同一个查询,server就会返回不同的结果。
repeatable read 就可以反复读。在一个事务对数据行运行读取或写入操作时锁定了这些数据行。
可是这样的方式又引发了幻想读的问题。
由于仅仅能锁定读取或写入的行,不能阻止还有一个事务插入数据,后期运行相同的查询会产生很多其它的结果。
serializable 模式中,事务被强制为依次运行。这是 SQL 标准建议的默认行为。
4 )假设多个事务更新了同一行。就能够通过回滚当中一个事务来解除死锁。
5 ) MySQL 同意利用 set transaction 来设置隔离级别。
6 )事务仅仅用于 insert 和 update 语句来更新数据表。不能用于对表结构的更改。运行一条更改表结构或 begin 则会马上提交当前的事务。
7 )全部表类型都支持表级锁,可是 MyISAM 仅仅支持表级锁。
8 )有两种类型的表级锁:读锁和写锁。
读锁是共享锁。支持并发读。写操作被锁。
写锁是独占锁,上锁期间其它线程不能读表或写表。
8 )假设要支持并发读写,建议採用 InnoDB 表,由于它是採用行级锁,能够获得很多其它的更新性能。
9 )非常多时候,能够通过经验来评估什么样的锁相应用程序更合适。只是通常非常难说一个锁比别的更好。这全都要根据应用程序来决定。不同的地方可能须要不同的锁。
当前 MySQL 已经支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁了。 BDB 表支持页级锁, InnoDB 表支持行级锁。
10 ) MySQL 的表级锁都是写锁优先,并且是採用排队机制,这样不会出现死锁的情况。对于 InnoDB 和 BDB 存储引擎来说,是可能产生死锁的。这是由于 InnoDB 会自己主动捕获行锁。 BDB 会在运行 SQL 语句时捕获页锁的。而不是在事务的開始就这么做。
1.2. 不同锁的优缺点及选择
行级锁的长处及选择 :
1 )在非常多线程请求不同记录时降低冲突锁。
2 )事务回滚时降低改变数据。
3 )使长时间对单独的一行记录加锁成为可能。
行级锁的缺点 :
1 )比页级锁和表级锁消耗很多其它的内存。
2 )当在大量表中使用时。比页级锁和表级锁更慢。由于他须要请求很多其它的所资源。
3 )当须要频繁对大部分数据做 GROUP BY 操作或者须要频繁扫描整个表时。就明显的比其他锁更糟糕。
4 )使用更高层的锁的话,就能更方便的支持各种不同的类型应用程序,由于这样的锁的开销比行级锁小多了。
5 )能够用应用程序级锁来取代行级锁。比如 MySQL 中的 GET_LOCK() 和 RELEASE_LOCK() 。
但它们是劝告锁(原文: These are advisory locks ),因此仅仅能用于安全可信的应用程序中。
6 )对于 InnoDB 和 BDB 表, MySQL 仅仅有在指定用 LOCK TABLES 锁表时才使用表级锁。
在这两种表中,建议最好不要使用 LOCK TABLES 。由于 InnoDB 自己主动採用行级锁。 BDB 用页级锁来保证事务的隔离。
表锁的长处及选择:
1 )非常多操作都是读表。
2 )在严格条件的索引上读取和更新。当更新或者删除能够用单独的索引来读取得到时: UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;DELETE FROM tbl_name WHERE unique_key_col=key_value;
3 ) SELECT 和 INSERT 语句并发的运行,可是仅仅有非常少的 UPDATE 和 DELETE 语句。
4 )非常多的扫描表和对全表的 GROUP BY 操作,可是没有不论什么写表。
表锁的缺点:
1 )一个client提交了一个须要长时间执行的 SELECT 操作。
2 )其它client对同一个表提交了 UPDATE 操作。这个client就要等到 SELECT 完毕了才干開始运行。
3 )其它client也对同一个表提交了 SELECT 请求。因为 UPDATE 的优先级高于 SELECT 。所以 SELECT 就会先等到 UPDATE 完毕了之后才開始运行,它也在等待第一个 SELECT 操作。
1.3. 怎样避免锁的资源竞争
1 )让 SELECT 速度尽量快,这可能须要创建一些摘要表。
2 )启动 mysqld 时使用參数 --low-priority-updates 。这就会让更新操作的优先级低于 SELECT 。
这样的情况下,在上面的如果中,第二个 SELECT 就会在 INSERT 之前运行了,并且也无需等待第一个 SELECT 了。
3 )能够运行 SET LOW_PRIORITY_UPDATES=1 命令,指定全部的更新操作都放到一个指定的链接中去完毕。
4 )用 LOW_PRIORITY 属性来减少 INSERT 。 UPDATE 。 DELETE 的优先级。
5 )用 HIGH_PRIORITY 来提高 SELECT 语句的优先级。
6 )从 MySQL 3.23.7 開始,能够在启动 mysqld 时指定系统变量 max_write_lock_count 为一个比較低的值。它能强制暂时地提高表的插入数达到一个特定值后的全部 SELECT 操作的优先级。它同意在 WRITE 锁达到一定数量后有 READ 锁。
7 )当 INSERT 和 SELECT 一起使用出现故障时。能够转而採用 MyISAM 表,它支持并发的 SELECT 和 INSERT 操作。
8 )当在同一个表上同一时候有插入和删除操作时。 INSERT DELAYED 可能会非常实用。
9 )当 SELECT 和 DELETE 一起使用出现故障时, DELETE 的 LIMIT 參数可能会非常实用。
10 )运行 SELECT 时使用 SQL_BUFFER_RESULT 有助于减短锁表的持续时间。
11 )能够改动源码 `mysys/thr_lock.c' ,仅仅用一个所队列。这样的情况下,写锁和读锁的优先级就一样了。这对一些应用可能有帮助。
MySQL具体解释(14)----------事务处理的更多相关文章
- [MySQL Reference Manual]14 InnoDB存储引擎
14 InnoDB存储引擎 14 InnoDB存储引擎 14.1 InnoDB说明 14.1.1 InnoDB作为默认存储引擎 14.1.1.1 存储引擎的趋势 14.1.1.2 InnoDB变成默认 ...
- MySQL具体解释(5)-----------函数超全总结
mysql函数大全 对于针对字符串位置的操作.第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值. 假设str是空字符串,返回0.假设str是NULL,返 ...
- CentOS 6.4下编译安装MySQL 5.6.14
概述: CentOS 6.4下通过yum安装的MySQL是5.1版的,比较老,所以就想通过源代码安装高版本的5.6.14. 正文: 一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server ...
- spring mvc 4.3.2 + mybatis 3.4.1 + mysql 5.7.14 +shiro 幼儿园收费系统 之 登录
如标题,用spring mvc 4.3.2+mybatis 3.4.1 + mysql 5.7.14 +shiro 开发了一个用于幼儿园的管理系统. 功能模块 包括 账号,角色,权限管理. 幼儿档案管 ...
- CentOS 6.4 编译安装Mysql 5.6.14
概述: CentOS 6.4下通过yum安装的MySQL是5.1版的,比较老,所以就想通过源代码安装高版本的5.6.14. 正文: 一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server ...
- LNMP搭建01 -- 编译安装MySQL 5.6.14 和 LNMP相关的区别
[编译安装MySQL 5.6.14] [http://www.cnblogs.com/xiongpq/p/3384681.html ] [mysql-5.6.14.tar.gz 下载] http:/ ...
- CentOS 7 源码编译安装MySQL 5.7.14
一.添加用户和组 1. 进入root: su 2. 添加组: groupadd mysql 3. 添加用户: useradd -r -g mysql -s /bin/false mysql 二.安装 ...
- MySQL 8.0.14 新的密码认证方式和客户端链接
MySQL 8.0.14 新的密码认证方式和客户端链接 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MySQL8.0在密码认证方式发生了改变,这也是有点小伙伴在MySQL创建 ...
- mysql 5.7以上版本安装配置方法图文教程(mysql 5.7.12\mysql 5.7.13\mysql 5.7.14)(转)
http://www.jb51.net/article/90302.htm ******************************* 这篇文章主要为大家分享了MySQL 5.7以上缩版本安装配置 ...
- mysql 5.7.14 安装配置方法图文教程(转)
http://www.jb51.net/article/90259.htm ******************************** 因笔者个人需要需要在本机安装Mysql,先将安装过程记录如 ...
随机推荐
- mac最新系统安装beego出现kiil 9
(内容来自:http://www.oschina.net/question/2626413_2237311) 应该是最新mac OS 12.04的锅. 现在的解决办法是回退bee到以前版本. cd $ ...
- 关于JavaWeb开发的一些感悟
从事JavaWeb的开发已经三年了,从最开始的啥都不会,到慢慢的能够独立做项目,从一开始的一片茫然,到现在的心中有数.对于技术.业务也有了自己的看法. JavaWeb开发所涉及到的知识点非常多,涉及到 ...
- iOS动画-扩散波纹效果
最终效果 实现思路 动画的表现形式是颜色以及大小的变化,整体效果可以看做多个单独的波纹效果的叠加.因此我们可以创建多个CALayer,分别赋予CABasicAnimation动画,组成最终的动画效果. ...
- 习题:Dual Matrices(思路题/分治)
tyvj1764 描述一个N行M列的二维矩阵,矩阵的每个位置上是一个绝对值不超过1000的整数.你需要找到两个不相交的A*B的矩形,使得这两个矩形包含的元素之和尽量大.注:A*B的矩形指连续的A行.B ...
- NBUT 1618 投放炸弹(树状数组)
[1618] 投放炸弹 时间限制: 1000 ms 内存限制: 65535 K 问题描述 我们定义一个炸弹能炸毁的地方要求曼哈顿距离小于等于某个值. 曼哈顿距离——两点在南北方向上的距离加上在东西方向 ...
- [AHOI2014&&JSOI2014][bzoj3876] 支线剧情 [上下界费用流]
题面 传送门 思路 转化模型:给一张有向无环图,每次你可以选择一条路径走,花费的时间为路径上边权的总和,问要使所有边都被走至少一遍(可以重复),至少需要花费多久 走至少一遍,等价于覆盖这条边 也就是说 ...
- 【CCF】URL映射 模拟
#include<iostream> #include<cstdio> #include<cstring> #include<string> #incl ...
- codeforces round375(div.2)题解
首先吐槽一下这套题...为什么EF全是图论QAQ 过了ABCD四个题...F的并查集死磕了好久... 不过似乎rank还算乐观...(因为ABC都是一次过的QAQ) Problem A: 啥都不想说Q ...
- MEF 注入[转载]
领域服务的时候,用到MEF的注入有参构造函数的方法,your master was attracted,打算稍微深挖一下,这篇来对此知识点做个总结. 一.知识点回顾 MEF作为IOC的方式之一,它的主 ...
- SpringTest(一)
SpringMvcTest总结: 最近要做单元测试,所以选择的是SpringTest这个测试框架. 1.准备工作.(导入jar包) 因为使用Maven管理jar包,所以在要做单元测试的模块中的p ...