Mysql数据库理论基础之八--数据库事务

一、简介

由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点:

  • 1、是一种数据库管理系统
  • 2、是一种关联数据库管理系统
  • 3、是一种开放源码软件,且有大量可用的共享MySQL软件
  • 4、MySQL数据库服务器具有快速、可靠和易于使用的特点
  • 5、MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中
  • InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建。这样,表的大小就能超过单独文件的最大容量。表空间可包括原始磁盘分区,从而使得很大的表成为可能。表空间的最大容量为64TB。

二、MySQL,ODBC    数据库事务

2.1.多事务同时执行

彼此之间互不影响的方式进行并行;事务之间交互,通过数据集。

START TRANSACTION: 启动事务命令   数据库只有启动了事务才允许回滚撤销等操作。

且数据的engine引擎必须是innodb,才支持事务

ROLLBACK :    回滚事务,mysql只要没有提交开启了事务都可以进行回滚操作。

COMMIT:           事务提交,事务提交后无法进行回滚操作。

若未明确启动事务:autocommit 能实现自动提交,每一个操作都直接提交;

建议:明确使用事务,否则所有操作都被当成一个事务来处理,并关闭自动提交。

否则浪费mysql很多IO操作,每写一条语句都执行提交至持久性存储,很浪费资源

2.2.事务的特性:

2.2.1.Atomicity:  原子性

事务所引起的数据库操作,要不都完成,要么都不执行;

2.2.2.Consistency: 一致性

2.2.3.Isolation:  隔离性

事务调度: 事务之间影响最小

MVCC:   多版本并发控制

2.2.4.Durability: 持久性

一旦事务成功完成,系统必须保证任何故障都不会引起事务表示出不一致性;

1、事务提交之前就已经写出数据至持久性存储;

2、结合事务日志完成;

事务日志:顺序IO

数据文件:随机IO

 2.3.事务的状态:

活动的:    active

部分提交的:  最后一条语句执行后

失败的:

终止的:

提交的:

状态间的转换过程

事务并发执行的优势:1、提高吞吐量和资源利用率     2、减少等待时间

事务调度:          1、可恢复调度                          2、无极联调度

三、实例:

3.1. 设置自动提交开关

mysql> SELECT @@AUTOCOMMIT;  #自动提交的状态1为开启,0为关闭;

+--------------+

| @@AUTOCOMMIT |

+--------------+

|    1   |

+--------------+

1 row in set (0.00 sec)

mysql> SET AUTOCOMMIT=0;  #设定自动提交关闭

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@AUTOCOMMIT;  #查询自动提交的状态1为开启,0为关闭;

+--------------+

| @@AUTOCOMMIT |

+--------------+

|    0   |

+--------------+

1 row in set (0.00 sec)

3.2. 回滚事务

mysql> SET AUTOCOMMIT=0;  #设定自动提交关闭

Query OK, 0 rows affected (0.00 sec)

mysql> commit     #将之前的事务全部提交

mysql> DELETE FROM student WHERE Name LIKE ‘Li%‘;    #删除Name字段包含Li的行

Query OK, 1 row affected (0.03 sec)

mysql> SELECT * FROM student;        #Li哪行已经被删除

+-----+------------+-----+-----+

| SID | Name | Age | CID |

+-----+------------+-----+-----+

| 2 | Cheng Long |  0 |  2 |

| 3 | Yang Guo |  0 |  3 |

| 4 | Guo Jing |  0 |  4 |

+-----+------------+-----+-----+

3 rows in set (0.00 sec)

mysql> ROLLBACK;    #回滚事务,自动提交关闭后,默认就开启了事务,可以实现回滚等操作

Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM student;  #删除的行恢复了

+-----+------------+-----+-----+

| SID | Name  | Age | CID |

+-----+------------+-----+-----+

|   1 | Li Lianjie |   0 |   1 |

|   2 | Cheng Long |   0 |   2 |

|   3 | Yang Guo   |   0 |   3 |

|   4 | Guo Jing   |   0 |   4 |

+-----+------------+-----+-----+

4 rows in set (0.00 sec)

  

3.2. 保存点:恢复到所定义的那个保存点SAVEPOINT,保存点名称不能为纯数字。

保存点:SAVEPOINT savepoint_name;  保存以上操作为该保存点名称

回滚保存点:ROLLBACK  TO savepoint_name;  回滚到该保存点之前的状态

3.2. 1.保存点实验一

mysql>  START TRANSACTION;             #启动事务

Query OK, 0 rows affected (0.00 sec)

mysql> SAVEPOINT a;        #该保存点student表数据都存在

Query OK, 0 rows affected (0.00 sec)

mysql> select * FROM student;

+-----+------------+-----+-----+

| SID | Name   | Age | CID |

+-----+------------+-----+-----+

|   1 | Li Lianjie |   0 |   1 |

|   2 | Cheng Long |   0 |   2 |

|   3 | Yang Guo  |  26 |   3 |

|   4 | Guo Jing  |  53 |   4 |

+-----+------------+-----+-----+

4 rows in set (0.00 sec)

mysql> DELETE FROM student WHERE SID=4;   #删除student表的SID为4的行

Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM student;

+-----+------------+-----+-----+

| SID | Name   | Age | CID |

+-----+------------+-----+-----+

|   1 | Li Lianjie |   0 |   1 |

|   2 | Cheng Long |   0 |   2 |

|   3 | Yang Guo  |  26 |   3 |

+-----+------------+-----+-----+

3 rows in set (0.00 sec)

mysql> SAVEPOINT b;  #该保存点student表数据的SID为4的行不存在了

Query OK, 0 rows affected (0.00 sec)

mysql> DELETE FROM student WHERE SID=3;

Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM student;

+-----+------------+-----+-----+

| SID | Name  | Age | CID |

+-----+------------+-----+-----+

|   1 | Li Lianjie |   0 |   1 |

|   2 | Cheng Long |   0 |   2 |

+-----+------------+-----+-----+

2 rows in set (0.00 sec)

mysql> SAVEPOINT c;      #该保存点student表的SID为3和4的行都不存在

Query OK, 0 rows affected (0.00 sec)

mysql> ROLLBACK TO b;    #回滚至保存点b,即student表,SID为4的行不存在的行

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM student;

+-----+------------+-----+-----+

| SID | Name   | Age | CID |

+-----+------------+-----+-----+

|   1 | Li Lianjie |   0 |   1 |

|   2 | Cheng Long |   0 |   2 |

|   3 | Yang Guo |  26 |   3 |

+-----+------------+-----+-----+

3 rows in set (0.00 sec)

mysql> ROLLBACK TO a;     #即所有数据都存在的那个点

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM student;

+-----+------------+-----+-----+

| SID | Name       | Age | CID |

+-----+------------+-----+-----+

|   1 | Li Lianjie |   0 |   1 |

|   2 | Cheng Long |   0 |   2 |

|   3 | Yang Guo   |  26 |   3 |

|   4 | Guo Jing   |  53 |   4 |

+-----+------------+-----+-----+

4 rows in set (0.00 sec)

3.2.2.保存点实验二

     3.2.2.1.设置a2、a4、a6、a8四个保存点

mysql> select * from tutors;

+-----+--------------+--------+------+

| TID | Tname   | Gender | Age  |

+-----+--------------+--------+------+

|   1 | HongQigong   | M      |   93 |

|   2 | HuangYaoshi  | M      |   63 |

|   3 | Miejueshitai | F      |   72 |

|   4 | OuYangfeng   | M      |   76 |

|   5 | YiDeng       | M      |   90 |

|   6 | YuCanghai    | M      |   56 |

|   7 | Jinlunfawang | M      |   67 |

|   8 | HuYidao      | M      |   42 |

|   9 | NingZhongze  | F      |   49 |

+-----+--------------+--------+------+

9 rows in set (0.00 sec)

mysql> delete from tutors where TID = 2 ;

Query OK, 1 row affected (0.00 sec)

mysql> savepoint a2 ;

Query OK, 0 rows affected (0.00 sec)

mysql> delete from tutors where TID = 4 ;

Query OK, 1 row affected (0.00 sec)

mysql> savepoint a4;

Query OK, 0 rows affected (0.00 sec)

mysql> delete from tutors where TID = 6 ;

Query OK, 1 row affected (0.00 sec)

mysql> savepoint a6;

Query OK, 0 rows affected (0.00 sec)

mysql> delete from tutors where TID = 8 ;

Query OK, 1 row affected (0.00 sec)

mysql> savepoint a8;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from tutors;

+-----+--------------+--------+------+

| TID | Tname   | Gender | Age  |

+-----+--------------+--------+------+

|   1 | HongQigong   | M      |   93 |

|   3 | Miejueshitai | F      |   72 |

|   5 | YiDeng       | M      |   90 |

|   7 | Jinlunfawang | M      |   67 |

|   9 | NingZhongze  | F      |   49 |

+-----+--------------+--------+------+

5 rows in set (0.00 sec)

     3.2.2.回滚到a4保存点OK

mysql> rollback to a4;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from tutors;

+-----+--------------+--------+------+

| TID | Tname    | Gender | Age  |

+-----+--------------+--------+------+

|   1 | HongQigong | M      |   93 |

|   3 | Miejueshitai | F      |   72 |

|   5 | YiDeng     | M      |   90 |

|   6 | YuCanghai  | M      |   56 |

|   7 | Jinlunfawang | M      |   67 |

|   8 | HuYidao    | M      |   42 |

|   9 | NingZhongze  | F      |   49 |

+-----+--------------+--------+------+

7 rows in set (0.00 sec)

     3.2.3.再回滚到a6保存点失败,该保存点已不存在

mysql> rollback to a6;

ERROR 1305 (42000): SAVEPOINT a6 does not exist

     3.2.4.但再回滚到a2保存点OK

mysql> rollback to a2;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from tutors;

+-----+--------------+--------+------+

| TID | Tname        | Gender | Age  |

+-----+--------------+--------+------+

|   1 | HongQigong   | M      |   93 |

|   3 | Miejueshitai | F      |   72 |

|   4 | OuYangfeng   | M      |   76 |

|   5 | YiDeng       | M      |   90 |

|   6 | YuCanghai    | M      |   56 |

|   7 | Jinlunfawang | M      |   67 |

|   8 | HuYidao      | M      |   42 |

|   9 | NingZhongze  | F      |   49 |

+-----+--------------+--------+------+

8 rows in set (0.00 sec)

     3.2.5.但再回滚到最原始保存点OK

mysql> rollback;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from tutors;

+-----+--------------+--------+------+

| TID | Tname        | Gender | Age  |

+-----+--------------+--------+------+

|   1 | HongQigong   | M      |   93 |

|   2 | HuangYaoshi  | M      |   63 |

|   3 | Miejueshitai | F      |   72 |

|   4 | OuYangfeng   | M      |   76 |

|   5 | YiDeng       | M      |   90 |

|   6 | YuCanghai    | M      |   56 |

|   7 | Jinlunfawang | M      |   67 |

|   8 | HuYidao      | M      |   42 |

|   9 | NingZhongze  | F      |   49 |

+-----+--------------+--------+------+

9 rows in set (0.00 sec)

     3.2.6.回滚到最原始保存点后,但再回滚a8、a2R失败

mysql> rollback to a8;

ERROR 1305 (42000): SAVEPOINT a8 does not exist

mysql> rollback to a2;

ERROR 1305 (42000): SAVEPOINT a2 does not exist

---end---9-

时间: 2024-07-31 17:46:51

Mysql数据库理论基础之八--数据库事务的相关文章

如何处理Spring、Ibatis结合MySQL数据库使用时的事务操作

Ibatis是MyBatis的前身,它是一个开源的持久层框架.它的核心是SqlMap--将实体Bean跟关系数据库进行映射,将业务代码和SQL语句的书写进行分开.Ibatis是"半自动化"的ORM持久层框架.这里的"半自动化"是相对Hibernate等提供了全面的数据库封装机制的"全自动化"ORM实现而言的,"全自动"ORM实现了POJO与数据库表字段之间的映射并且实现了SQL的自动生成和执行.而Ibatis的着力点,则在于P

如何处理Ibatis结合MySQL数据库使用时的事务操作

Ibatis是MyBatis的前身,它是一个开源的持久层框架.它的核心是SqlMap--将实体Bean跟关系数据库进行映射,将业务代码和SQL语句的书写进行分开.Ibatis是"半自动化"的ORM持久层框架.这里的"半自动化"是相对Hibernate等提供了全面的数据库封装机制的"全自动化"ORM实现而言的,"全自动"ORM实现了POJO与数据库表字段之间的映射并且实现了SQL的自动生成和执行.而Ibatis的着力点,则在于P

Mysql数据库理论基础之十二 ---- 备份与还原

一.简介 由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点: 1.是一种数据库管理系统 2.是一种关联数据库管理系统 3.是一种开放源码软件,且有大量可用的共享MySQL软件 4.MySQL数据库服务器具有快速.可靠和易于使用的特点 5.MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中 InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建.这样,表的大小就能超过单独文件的最大容量.表空间可包括原始磁盘分区,从而使得很大的表成为可能

Mysql数据库理论基础之十三 ---- LVM逻辑卷快照备份

一.简介 由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点: 1.是一种数据库管理系统 2.是一种关联数据库管理系统 3.是一种开放源码软件,且有大量可用的共享MySQL软件 4.MySQL数据库服务器具有快速.可靠和易于使用的特点 5.MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中 InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建.这样,表的大小就能超过单独文件的最大容量.表空间可包括原始磁盘分区,从而使得很大的表成为可能

Mysql数据库理论基础一

Mysql数据库理论基础一 一.简介 由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点: 1.是一种数据库管理系统 2.是一种关联数据库管理系统 3.是一种开放源码软件,且有大量可用的共享MySQL软件 4.MySQL数据库服务器具有快速.可靠和易于使用的特点 5.MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中 InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建.这样,表的大小就能超过单独文件的最大容量.表空间可包括原始磁盘分

数据库MySQL之 视图、触发器、存储过程、函数、事务、数据库锁、数据库备份、事件

浏览目录 视图 触发器 存储过程 函数 事务 数据库锁 数据库备份 事件 一.视图 1.视图概念 视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据. 2.视图特点 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系 视图是由基本表(实表)产生的表(虚表) 视图的建立和删除不影响基本表 对视图内容的更新(添加.删除和修改)直接影响基本表 当视图来自多个基本表时,不允许添加,修改和删除数据 3.视图的本质 视图是根据SQL语句获取动态的数据集,并为其命

mysql数据库和mongodb数据库的相关操作以及两个数据库的区别

在docs命令中执行数据操作 MySQL数据库 先启动MySQL服务器  net start mysql 进入MySQL服务器MySQL -uroot -p(这里写你的数据库密码) (-P是从哪个端口进) 我第一次操作是就是因为电脑上 有 MySQL  MySQL57 MySQLla 三个服务 引起端口冲突 导致 我 找不到相应的数据 数据库操作 create database   创建数据库 show databases   显示MySQL服务上的数据库 use  数据库          使

关系型数据库之Mysql编译安装及数据库基础(一)

一.为什么会有数据库呢? 刚开始接触数据库的朋友们,都会问数据库用来干啥的呢?字面表达的意思就是用来存储数据的仓库简称"数据库",在日常生活中我们与数据库相关的事务都是一大把一大把的,例如: 1.我们去做火车的时候需要实名认证,为什么安检人员可以通过我们的身份证就可以查询我们的个人信息呢,因为们都是有户口的群众,在公安居民信息库都录入着我们的信息,而们的信息也是存储在国家公民的信息库里面的,这也是我们所说的数据库,早期最传统的数据库就是文本文件,没当查询数据时都需要从头到尾把整个文件都

边记边学PHP-(十六)PHP使用MySQL扩展库操作数据库

PHP提供了很多扩展库,这里说的是使用MySQL扩展库,但是这种扩展库在不久的将来就会被摒弃,因为如果使用MySQL扩展库编写的代码在运行的时候会有warning的提示.我本来想直接写另一种,但是感觉这是基础.MySQL扩展库,一说到库,自然而然就想到是一堆函数,很多函数组成一个库,使用扩展库也就是使用里面的函数.MySQL扩展库是完全面向过程的,显然不符合面向对象的特性,被摒弃也是可以理解的.废话不多说,直接上重点. 一.PHP使用MySQL扩展库操作数据库的示意图 此图是我自己画的,可能有不