MySQL 事务

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
  • 事务用来管理 insert,update,delete 语句

一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

事务控制语句:

  • BEGIN或START TRANSACTION;显式地开启一个事务;

  • COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改成为永久性的;

  • ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

  • SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;

  • RELEASE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;

  • ROLLBACK TO identifier;把事务回滚到标记点;

  • SET TRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

MYSQL 事务处理主要有两种方法:

1、用 BEGIN, ROLLBACK, COMMIT来实现

  • BEGIN 开始一个事务
  • ROLLBACK 事务回滚
  • COMMIT 事务确认

2、直接用 SET 来改变 MySQL 的自动提交模式:

  • SET GLOBAL AUTOCOMMIT=0 禁止自动提交
  • SET GLOBAL AUTOCOMMIT=1 开启自动提交

MYSQL事务演示

准备

切换至相应的数据库下,并查看表信息

 mysql> use jobs;
mysql> show table status like "teachers"\G
*************************** . row ***************************
Name: teachers
Engine:  MyISAM <<
Version:
Row_format: Dynamic
Rows:
Avg_row_length:
Data_length:
Max_data_length:
Index_length:
Data_free:
Auto_increment:
Create_time: -- ::
Update_time: -- ::
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
row in set (0.00 sec)

修改表引擎为InnoDB

 mysql> alter table teachers engine=innodb;
Query OK, row affected (0.03 sec)
Records: Duplicates: Warnings: mysql> show table status like "teachers"\G
*************************** . row ***************************
Name: teachers
Engine: InnoDB
Version:
Row_format: Dynamic
Rows:
Avg_row_length:
Data_length:
Max_data_length:
Index_length:
Data_free:
Auto_increment:
Create_time: -- ::
Update_time: -- ::
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
row in set (0.00 sec)

回滚事务演示

 mysql> start transaction;               <<启动事务
Query OK, rows affected (0.00 sec) mysql> select * from teachers; <<查看表信息
+-----+------------+-----+--------+
| TID | Name | Age | Gender |
+-----+------------+-----+--------+
| | Song Jiang | | M |
+-----+------------+-----+--------+
row in set (0.00 sec) mysql> delete from teachers; <<删除表中数据
Query OK, row affected (0.01 sec) mysql> select * from teachers; <<查看表中数据,现在数据为空
Empty set (0.00 sec) mysql> rollback; <<回滚事务
Query OK, rows affected (0.01 sec) mysql> select * from teachers; <<再次查看数据,发现数据已经恢复
+-----+------------+-----+--------+
| TID | Name | Age | Gender |
+-----+------------+-----+--------+
| | Song Jiang | | M |
+-----+------------+-----+--------+
row in set (0.00 sec)

提交事务演示

mysql> start transaction;                      <<启动事务
Query OK, rows affected (0.00 sec) mysql> select * from teachers; <<查询表中数据
+-----+------------+-----+--------+
| TID | Name | Age | Gender |
+-----+------------+-----+--------+
| | Song Jiang | | M |
+-----+------------+-----+--------+
row in set (0.00 sec) mysql> insert into teachers values (,'ken',,'M'); <<向表中插入一些数据
Query OK, row affected (0.00 sec) mysql> select * from teachers; <<再次查看表中数据
+-----+------------+-----+--------+
| TID | Name | Age | Gender |
+-----+------------+-----+--------+
| | Song Jiang | | M |
| | ken | | M |
+-----+------------+-----+--------+
rows in set (0.00 sec) mysql> commit; <<进行提交数据操作
Query OK, rows affected (0.00 sec) mysql> select * from teachers; <<数据已经生效
+-----+------------+-----+--------+
| TID | Name | Age | Gender |
+-----+------------+-----+--------+
| | Song Jiang | | M |
| | ken | | M |
+-----+------------+-----+--------+
rows in set (0.00 sec)

设置和使用保存点演示

mysql> start transaction;              <<启动事务
Query OK, rows affected (0.00 sec) mysql> select * from teachers; <<查看表中数据
+-----+------------+-----+--------+
| TID | Name | Age | Gender |
+-----+------------+-----+--------+
| | Song Jiang | | M |
| | ken | | M |
+-----+------------+-----+--------+
rows in set (0.00 sec) mysql> savepoint ken1; <<设置保存点
Query OK, rows affected (0.00 sec) mysql> delete from teachers; <<删除表中全部的数据
Query OK, rows affected (0.00 sec) mysql> select * from teachers; <<查看表中的信息,现在为空
Empty set (0.00 sec) mysql> rollback to ken1; <<回滚到刚才设置的ken1节点
Query OK, rows affected (0.00 sec) mysql> select * from teachers; <<再次查看表中信息,已经回到ken1时候的状态
+-----+------------+-----+--------+
| TID | Name | Age | Gender |
+-----+------------+-----+--------+
| | Song Jiang | | M |
| | ken | | M |
+-----+------------+-----+--------+
rows in set (0.00 sec) mysql> commit; <<进行事务的提交,结束事务
Query OK, rows affected (0.00 sec) mysql> select * from teachers; <<可以再查看一下表中信息,进行确认
+-----+------------+-----+--------+
| TID | Name | Age | Gender |
+-----+------------+-----+--------+
| | Song Jiang | | M |
| | ken | | M |
+-----+------------+-----+--------+
rows in set (0.00 sec)

关闭自动提交

mysql中一个sql语句就是一个事务,mysql系统默认是开启了事务提交的功能,可以使用如下命令进行查看。

mysql> show global variables like "autocommit";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
row in set (0.01 sec)

如果想要关闭自动提交的功能,可以试下如下命令进行操作。

mysql> set global autocommit=;
Query OK, rows affected (0.00 sec) mysql> show global variables like "autocommit";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
row in set (0.00 sec)

MySQL系列详解四:MySQL事务-技术流ken的更多相关文章

  1. Ansible基础认识及安装使用详解(week5_day1_part1)--技术流ken

    Ansible简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量 ...

  2. Linux常用命令详解(week1_day1_3)--技术流ken

    本节内容 pidofpstopipuptimewgetcurltrddtargrepfind 命令详解 1.pidof 获取正在运行程序的PID 实例1: [root@ken ~]# pidof ss ...

  3. Linux常用命令详解(week1_day1_2)--技术流ken

    本节内容 aliasunaliasunamesuhostnamehistorywhichwcwwhowhoamipingkillseqdudffreedate 命令详解 1. alias 设置.’查看 ...

  4. Linux常用命令详解(week1_day1_1)--技术流ken

    本节内容 基础命令:lsmanpwdcdmkdirechotouchcpmvrmrmdircatmorelessheadtailclearpoweroffreboot进阶命令(下一章节):aliasu ...

  5. MySQL系列详解八:MySQL多线程复制演示-技术流ken

    前言 Mysql 采用多线程进行复制是从 Mysql 5.6 开始支持的内容,但是 5.6 版本下有缺陷,虽然支持多线程,但是每个数据库只能一个线程,也就是说如果我们只有一个数据库,则主从复制时也只有 ...

  6. MySQL/MariaDB数据库忘掉密码解决办法--技术流ken

    前言 有些时候我们常常会忘掉一些服务的密码,比如系统密码,我们可以进入救援模式进行修改密码,可参考我之前的博客<Centos7破解密码的两种方法--技术流ken>.但有些时候我们也会忘掉数 ...

  7. MySQL系列详解六:MySQL主从复制/半同步演示-技术流ken

    前言 随着技术的发展,在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的需求.此时数据库集群就很好的解决了这个问题了.采用MySQL分布式集群,能够搭建一个高并发.负载均衡的集群服务器.在 ...

  8. MySQL系列详解三:MySQL中各类日志详解-技术流ken

    前言 日志文件记录了MySQL数据库的各种类型的活动,MySQL数据库中常见的日志文件有 查询日志,慢查询日志,错误日志,二进制日志,中继日志 .下面分别对他们进行介绍. 查询日志 1.查看查询日志变 ...

  9. MySQL系列详解五: xtrabackup实现完全备份及增量备份详解-技术流ken

    xtrabackup简介 xtrabackup是一个用来对mysql做备份的工具,它可以对innodb引擎的数据库做热备.xtrabackup备份和还原速度快,备份操作不会中断正在执行的事务,备份完成 ...

随机推荐

  1. REdis Asynchronous AOF fsync is taking too long

    redis.conf中的no-appendfsync-on-rewrite默认值为no,表示在重写AOF文件或RDB文件时阻塞fsync. 如果重写AOF或RDB文件时长过长,则在日志中可以看到如下信 ...

  2. 所有子节点、Procedure、MySQL

    在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点.但很遗憾,在MySQL的目前版本中还没有对应的功能. ...

  3. npm: 权限阻止修复

    在使用 npm install 时,总提示: Error: EACCES: permission denied 今天通过这个命令设置了权限解决了问题: sudo chown -R $(whoami) ...

  4. 2000 ASCII码排序

    声明:从今天开始每周至少做七道杭电ACM题,锻炼思考能力. 2000  ASCII码排序 Problem Description 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符. ...

  5. 命令行方式登录PostgreSQL

    目录: 一.在默认配置条件下,本机访问PostgreSQL 二.创建新用户来访问PostgreSQL 三.最简单的做法 四.开启远程访问 一.在默认配置条件下,本机访问PostgreSQL 切换到Li ...

  6. Python 每日随笔

    使用python已经有3个月了,带总体来说,还是python菜鸟,今天发现了一个好玩的东西,记录下来,有时间深入研究一下. 关于Metaclass 不得不说python 的元类很有意思,可以做很多有趣 ...

  7. package-lock.json,我们应该了解

    原谅我占2017年12月31日一个坑,后续补上

  8. Java常用的经典排序算法:冒泡排序与选择排序

     一.冒泡排序                             冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为 ...

  9. Android 基本控件相关知识整理

    Android应用开发的一项重要内容就是界面开发.对于用户来说,不管APP包含的逻辑多么复杂,功能多么强大,如果没有提供友好的图形交互界面,将很难吸引最终用户.作为一个程序员如何才能开发出友好的图形界 ...

  10. feign包名路径添加问题

    1. feign包名路径添加问题 1.1. 问题 在SpringCloud中使用feign调用路径中,不能在类上直接添加@RequestMapping(value = "/hospital- ...