MySQL中事物的详解
1. 事物的定义及特性
事务是一组操作数据库的SQL语句组成的工作单元,该工作单元中所有操作要么同时成功,要么同时失败。事物有如下四个特性,ACID简称“酸性”。
1)原子性:工作单元中所有的操作要么都成功,要么都不成功,不会出现部分成功的情况。
2)一致性:工作完成其结果应与预期一致,比如由A账户向B账户转账的事物,若该事物执行成功则必须保证A账户转出多少钱,B账户相应转入多少钱;若该事物失败,则此次转账即失败。事物的其它三个性质都是为了保证该一致性的。
3)隔离性:隔离性还可以称为并发控制、可串行化、锁等。事物中所操作的数据要隔离起来,以防止其他用户访问这些数据而带来的不一致情况。
4)持久性:事务一旦提交,其所做的修改就会永久保存到数据库中,即使数据库发生故障也不应该对其有任何影响。
事务的持久性不能做到100%的持久,只能从事务本身的角度来保证永久性,而一些外部原因导致数据库发生故障,如硬盘损坏,那么所有提交的数据可能都会丢失。
2. MySQL中开启事务的方法

2.1.方法一
用BEGIN或START TRANSACTION来开启一个事物,COMMIT或ROLLBACK来结束该事物。
-- 保存点 savepoint
begin
declare is_error int default false;#是否出错的标志
declare continue handler for sqlexception
set is_error=true;#声明异常处理程序,如果sql异常,则把标志为设置为true
start TRANSACTION;#开启事务,则会同时失败,同时成功
savepoint s1;#创建保存点
insert into employee(id,name,salary) values(146,'cq',9000);
savepoint s2;
insert into employee(id,name,salary) values(101,'cq',9000);
insert into employee(id,name,salary) values(102,'cq',9000);
if is_error THEN
rollback to savepoint s1;-- 还原到s1
insert into employee(id,name,salary) values(151,'cq',9000);
insert into employee(id,name,salary) values(152,'cq',9000);
commit;
end if;
end;
2.2.方法二
关闭自动提交,设置SET AUTOCOMMIT = 0,该语句后的所有操作都将变成事物操作,而且关闭自动提交的情况下,每个事物结束其后续操作都将开启新的事物。
set autocommit=0;#关闭自动提交
#因为关闭了自动提交事务,则添加数据不会保存到数据库中
insert into employee(id,name,salary) values(143,'cq',9000);
commit;#手动提交所有未执行的数据
#由于是关闭自动提交的方式开启的事务,所以每个事物结束其后的操作自动开启新的事物
insert into employee(id,name,salary) values(258,'wd',8000); #该操作属于新启的事物
3. 事物的隐式提交
由于事物不能被嵌套,所以当新事物开启时其前的旧事物会被隐式提交。如下情况会导致事物被隐式提交:
1)新事物的开启会导致旧事物的隐式提交
START TRANSACTION;
INSERT INTO `dm_性别`(性别名称) VALUES('不限');#该操作会被隐式提交
START TRANSACTION;
INSERT INTO `dm_性别`(性别名称) VALUES('男女');
ROLLBACK;
2)InnoDB中所有的DDL或DCL操作都会开启一个新的事物,所以DDL或DCL语句会导致旧事物的隐式提交
SET AUTOCOMMIT = 0;#利用法二关闭自动提交来开启事务
BEGIN;
INSERT INTO t1 VALUES (1);
#该DDL语句会导致其前面的插入操作隐式提交 ,并开启一单一的事物
CREATE TABLE t2 (pk int primary key);
INSERT INTO t2 VALUES (2); #自动开启新的事物
ROLLBACK; #插入表t1的数据已提交,仅能回滚插入表t2的操作
3)过程的执行区结束End之前会有一次隐式提交
BEGIN
START TRANSACTION;
INSERT INTO `dm_性别`(性别名称) VALUES('不限');
INSERT INTO `dm_性别`(性别名称) VALUES('男女');
END #在此之前会导致事物的隐式提交
4. 有关事物操作的注意事项
① 存储过程的执行区Begin会开启一个事物,执行区结束End会隐式提交一次
BEGIN
INSERT INTO `dm_性别`(性别名称) VALUES('不限');
INSERT INTO `dm_性别`(性别名称) VALUES('男女');
## COMMIT隐式提交该执行区域的操作
END
② 不要在事物的中途进行提交操作,一方面会破坏事物的原子性 ,另一方面该事物会到此结束
create table testproc(id int(4) primary key, name varchar(100));
#测试过程
CREATE PROCEDURE test_proc_ins(
IN i_id INT,
IN i_name VARCHAR(100)
)
BEGIN
start transaction; #本意是将两次插入操作捆绑成一个事物
INSERT INTO testproc VALUES (i_id, i_name);
COMMIT;#由于中途提交导致该事物提交前结束,其后的操作不再是事物操作
INSERT INTO testproc VALUES (i_id, i_name); #这里故意违反主键约束
ROLLBACK;#由于第一条插入数据的操作已提交,故这里的ROLLBACK无效
END;
③ 由于DDL或DCL操作会创建新的事物,这导致其前的操作会隐式提交,从而破坏事物的原子性,所以尽量不要在过程中使用DDL或DCL语句。而且在过程中使用DDL或DCL语句的语法是比较复杂的,所以不建议在过程中使用DDL或DCL语句。
SET AUTOCOMMIT = 0;
BEGIN;
INSERT INTO t1 VALUES (1);
#该DDL语句开启新事物会隐式提交其前的事物
CREATE TABLE t2 (pk int primary key);
INSERT INTO t2 VALUES (2);
ROLLBACK;
SHOW TABLES
④ Start Transaction(Begin)与闭自动提交开启事务的区别:
Start Transaction只开启了一个当前事物,该事物结束其后的操作将不再是事物操作;但关闭自动提交的方式开启事务,每个事物结束其后的操作自动默认为新的事物操作。
⑤ MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关:
1.MyISAM:不支持事务,用于只读程序提高性能
2.InnoDB:支持ACID事务、行级锁、并发
3.Berkeley DB:支持事务
MySQL中事物的详解的更多相关文章
- MySQL系列详解三:MySQL中各类日志详解-技术流ken
前言 日志文件记录了MySQL数据库的各种类型的活动,MySQL数据库中常见的日志文件有 查询日志,慢查询日志,错误日志,二进制日志,中继日志 .下面分别对他们进行介绍. 查询日志 1.查看查询日志变 ...
- Mysql中explain作用详解
一.MYSQL的索引 1.索引(Index):帮助Mysql高效获取数据的一种数据结构.用于提高查找效率,可以比作字典.可以简单理解为排好序的快速查找的数据结构.2.索引的作用:便于查询和排序(所以添 ...
- Mysql中timestamp用法详解
前言:时间戳(timestamp),一个能表示一份数据在某个特定时间之前已经存在的. 完整的. 可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间.使用数字签名技术产生的数据, 签名的对象包括了 ...
- Python3.7.1学习(七)mysql中pymysql模块详解(一)
pymysql是纯用Python操作MySQL的模块,其使用方法和MySQLdb几乎相同.此次介绍mysql以及在python中如何用pymysql操作数据库, 以及在mysql中存储过程, 触发器以 ...
- Mysql中的Join详解
一.Simple Nested-Loop Join(简单的嵌套循环连接) 简单来说嵌套循环连接算法就是一个双层for 循环 ,通过循环外层表的行数据,逐个与内层表的所有行数据进行比较来获取结果,当执行 ...
- Mysql中的delimiter详解
初学mysql时,可能不太明白delimiter的真正用途,delimiter在mysql很多地方出现,比如存储过程.触发器.函数等. 学过oracle的人,再来学mysql就会感到很奇怪,百思不得其 ...
- MySQL中EXPLAIN命令详解
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: expla ...
- MySQL中的视图详解
一.什么是视图? 简单来说,视图就是从一张表中导出的虚拟表.视图拥有表的结构,但是在数据库中只有视图的定义,但是没有视图中的数据. 视图是由查询语句从一张表中导出来的数据,不是一张实际的表. 二.视图 ...
- Python中操作mysql的pymysql模块详解
Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...
随机推荐
- Linux小知识(1): bash中执行数据库的相关操作
工作中经常会遇到命令行操作数据库或登陆至其他服务器等情况,往往需要通过命令行进入相关的数据库或登陆至相关的服务器,再执行指令操作,因此有没有方法,在命令行或bash脚本中模拟进入数据库或登陆服务器操作 ...
- 详细记录vue项目实战步骤(含vue-cli脚手架)
一.通过vue-cli创建了一个demo. (vue-cli是快速构建这个单页应用的脚手架,本身继承了多种项目模板:webpack(含eslit,unit)和webpack-simple(无eslin ...
- DataColumn.Expression提示“...循环引用”的错误
我碰到这个问题的时候,在网上找了找,找到了有好几个提出这个问题的人,但是都没有得到解答,当时很郁闷.然后再看看msdn中的解释与自己的测试,才把这个问题给解决了. 代码如下: person.Colum ...
- Swift UI开发初探 (转)
原文地址:http://www.tairan.com/archives/6600 关于Swift语法,可以参考<Apple Swift编程语言入门教程> 效果如下: 开发环境 Xcode6 ...
- Chrome浏览器安装vue-devtools插件
插件功能:方便在浏览器调试vue代码 插件git地址:https://github.com/vuejs/vue-devtools 因为chrome要FQ,打不开,所以不能直接进去安装拓展程序,只能选择 ...
- 好用的切换滑动焦点图框架jquery.superslide
拿到学习网站:http://www.superslide2.com/
- Dynamics CRM 2011通过客户端代码选择视图
在实施的过程中我们经常会遇到这样的场景,有个系统标准的Lookup字段对应的不是一种Entity,如很多地方的客户实际上可选account或者contact,有的地方可选systemuser或者tea ...
- Spring Boot入门程序-STS
使用Eclipse EE 中的 Spring Tool插件,完成 第一个Spring Boot应用程序的创建. 一.安装Spirng Tool插件 在 Eclipse EE Oxygen版本,安装“S ...
- C#或Net连接Oracle操作提示 Oracle 客户端 version 8.1.7 或更高版本报错
异常问题 远程连接ORCALE 服务器,而本地未安装任何ORCALE 相关客户端及ODAC .using System.Data.OracleClient;当我们用程序操作Oracle库的时候,OPE ...
- IOS 通过 代码 自定义cell(Cell的高度不一致)(优化性能)
创建cell的步骤 1.新建一个继承自UITabelViewCell的类 2.重写 initWithStyle:ReuseIdentifier: 方法 添加所有需要显示的子控件(不需要设置子控件的数据 ...