1.什么是事务

数据库事务:(database transaction): 事务是由一组SQL语句组成的逻辑处理单元,一组事务中的SQL语句要不全部执行成功功;如果其中某一条执行失败,则这组SQL语句中已经执行的语句会回滚到这组SQL语句执行之前的状态。

事务处理,可以确保非事务性单元的多个操作都能成功完成,否则不会更新数据资源。

数据库默认事务是自动提交的, 也就是发一条 sql 它就执行一条。如果想多条 sql 放在一个事务中执行,则需要使用事务进行处理。

当我们开启一个事务,并且没有提交,可以使用 rollback 命令手动回滚事务。

优点:

通过将一组操作组成一个事务执行时,要么全部成功,要么全部失败的单元。
使程序更可靠,简化错误恢复。

例如,A用户给B用户转账1000元,此时表现在SQL语句上,就是先更新A账户在的余额,减去1000,然后再更新B账户的余额,加上1000。以上操作对应数据库为两个update操作,这两个操作属于一个事物。否则,万一当数据库在减去A账户上的钱,而还没来得及在B账户加上1000时,数据库出现故障,此时就会出现这1000元钱消失的悲剧,这时数据库的事务就派上用场了。

2. 事务四大特性

事务是必须满足4个条件(ACID):

2.1 原子性(Autmic)

事务在执行时,要做到“要么不做,要么全做!”,就是说不允许事务只执行其中一部分。
即使因为故障而使事务不能完成,在rollback时也要消除对数据库的影响。

2.2 一致性(Consistency)

事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
在事务开始之前和结束之后,数据库的完整性约束没有被破坏

2.3 隔离性(Isolation)

一个事务的执行不能被其他事务干扰。
即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰,这些通过锁来实现。

2.4 持久性(Durability)

指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
接下来的其他操作或故障(比如说宕机等)不应该对其有任何影响。

事务的ACID特性可以确保银行不会弄丢你的钱。而在应用逻辑中,要实现这点非常难,甚至可以说是不可能完成的任务。

3. MySQL事务的使用方法

3.1 用BEGIN,ROLLBACK,COMMIT来实现

START TRANSACTION | BEGIN [WORK]  开启事务
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] 提交当前事务,执行永久操作。
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] 回滚当前事务到开始点,取消上一次开始点后的所有操作。
SAVEPOINT 名称 折返点

3.2 直接用 SET AUTOCOMMIT 来改变mysql的自动提交模式

MySQL/MariaDB数据库默认是自动提交的,也就是你提交一组SQL语句,数据库就会立即执行。
此时可以使用`SET AUTOCOMMIT`命令来设置事务是否自动提交。
SET AUTOCOMMIT默认是自动提交的。

SET AUTOCOMMIT命令语法:

SET AUTOCOMMIT = {0 | 1}

SET AUTOCOMMIT命令的值的设定解析

0:禁止自动提交
1:开启自动提交。

需要注意的是,MySQL/MariaDB中只有INNODB和BDB类型的数据表才能支持事务处理!另外一种常用的数据库引擎MyISAM是不支持事务操作的。

例子:

MariaDB [book]> set autocommit = 0;				# 设置数据库关闭自动提交
Query OK, 0 rows affected (0.00 sec) MariaDB [book]> delimiter // # 修改SQL语句的结束符为'//'
MariaDB [book]> start transaction; # 定义一组事务操作语句
-> update books set bName="ccc" where bId=1; # 把bId等于1的books表的记录的bName改为'ccc'
-> update books set bName="ddd" where bId=2; # 把bId等于2的books表的记录的bName改为'ddd'
-> commit;//
Query OK, 0 rows affected (0.01 sec) Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 Query OK, 0 rows affected (0.01 sec) MariaDB [book]> delimiter ; # 把sql语句的结束标志重新改回';'
MariaDB [book]> select bName from books where bId=1 or bId=2; # 查找books表中bId等于1或2的所有记录的bName字段信息
+-------+
| bName |
+-------+
| ccc |
| ddd |
+-------+
2 rows in set (0.00 sec) MariaDB [book]> show create table books\G # 查看books表的创建信息,可以看出books表使用MyISAM数据引擎,MyISAM引擎不支持事务操作,所以要到books表的引擎改为InnoDB
*************************** 1. row ***************************
Table: books
Create Table: CREATE TABLE `books` (
`bId` int(4) NOT NULL AUTO_INCREMENT,
`bName` varchar(255) DEFAULT NULL,
`bTypeId` enum('1','2','3','4','5','6','7','8','9','10') DEFAULT NULL,
`publishing` varchar(255) DEFAULT NULL,
`price` int(4) DEFAULT NULL,
`pubDate` date DEFAULT NULL,
`author` varchar(30) DEFAULT NULL,
`ISBN` varchar(255) DEFAULT NULL,
PRIMARY KEY (`bId`),
FULLTEXT KEY `index_bName` (`publishing`)
) ENGINE=MyISAM AUTO_INCREMENT=45 DEFAULT CHARSET=utf8
1 row in set (0.00 sec) MariaDB [book]> alter table category engine=innodb; # 修改category数据表的引擎为InnoDB
Query OK, 9 rows affected (0.03 sec)
Records: 9 Duplicates: 0 Warnings: 0 MariaDB [book]> alter table books engine=innodb; # 修改books数据表的引擎为InnoDB
Query OK, 39 rows affected (0.02 sec)
Records: 39 Duplicates: 0 Warnings: 0 MariaDB [book]> show create table books; # 查看books数据表的创建信息,可以看到books表已经使用InnoDB引擎了
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| books | CREATE TABLE `books` (
`bId` int(4) NOT NULL AUTO_INCREMENT,
`bName` varchar(255) DEFAULT NULL,
`bTypeId` enum('1','2','3','4','5','6','7','8','9','10') DEFAULT NULL,
`publishing` varchar(255) DEFAULT NULL,
`price` int(4) DEFAULT NULL,
`pubDate` date DEFAULT NULL,
`author` varchar(30) DEFAULT NULL,
`ISBN` varchar(255) DEFAULT NULL,
PRIMARY KEY (`bId`)
) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec) MariaDB [book]> show create table category; # 查看category数据表,category数据表也已经使用InnoDB引擎了
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| category | CREATE TABLE `category` (
`bTypeId` int(4) NOT NULL AUTO_INCREMENT,
`bTypeName` varchar(40) DEFAULT NULL,
PRIMARY KEY (`bTypeId`),
KEY `bTypeName` (`bTypeName`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec) MariaDB [book]> set autocommit = 0; # 设置数据表不自动提交
Query OK, 0 rows affected (0.00 sec) MariaDB [book]> delimiter // # 把sql语句的结束符更改为'//'
MariaDB [book]> start transaction; # 定义一组事务操作语句
-> update books set bName="book1" where bId=1; # 把books数据表中bId为1的记录的bName字段改为'book1'
-> update books set bName="book2" where bId=2; # 把books数据表中bId为2的记录的bName字段改为'book2'
-> commit// # 使用commit提交更改,此时整个事务操作已经完成,不能回滚到update之前的状态了
Query OK, 0 rows affected (0.01 sec) Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 Query OK, 0 rows affected (0.03 sec) MariaDB [book]> delimiter ; # 把sql语句的结束符改回';'
MariaDB [book]> select bName from books where bId=1 or bId=2; # 查询books数据表中bId为1或2的记录的bName字段信息
+-------+
| bName |
+-------+
| book1 |
| book2 |
+-------+
2 rows in set (0.00 sec) MariaDB [book]> delimiter // # 把sql语句的结束符更改为'//'
MariaDB [book]> start transaction; # 定义一组事务操作语句
-> update books set bName = "name1"; # 把books数据库中所有bName字段更新为'name1'
-> //
Query OK, 0 rows affected (0.01 sec) Query OK, 39 rows affected (0.01 sec)
Rows matched: 39 Changed: 39 Warnings: 0 MariaDB [book]> select bName from books; # 查看books数据表中所有记录的bName字段信息
-> //
+-------+
| bName |
+-------+
| name1 |
| name1 |
| name1 |
| name1 |
| name1 |
| name1 |
| name1 |
+-------+
39 rows in set (0.01 sec) MariaDB [book]> rollback// # 使用rollback进行回滚操作,由于在前面设置了不自动提交,所以可以回滚成功
Query OK, 0 rows affected (0.01 sec) MariaDB [book]> select bName from books// # 查询books数据表中所有记录的bName字段信息
+---------------------------------------------------------+
| bName |
+---------------------------------------------------------+
| book1 |
| book2 |
| 网络程序与设计-asp |
| pagemaker 7.0短期培训教程 |
| 黑客攻击防范秘笈 |
| Dreamweaver 4入门与提高 |
| 网页样式设计-CSS |
| Internet操作技术 |
| Dreamweaver 4网页制作 |
| Auto CAD职业技能培训教程 |
| Fireworks 4网页图形制作 |
| 自己动手建立企业局域网 |
| 页面特效精彩实例制作 |
| 平面设计制作整合案例详解-页面设计卷 |
| Illustrator 10完全手册 |
| FreeHand 10基础教程 |
| 网站设计全程教程 |
| 动态页面技术-HTML 4.0使用详解 |
| Auto CAD 3D模型大师 |
| Linux傻瓜书 |
| 网页界面设计艺术教程 |
| Flash MX 标准教程 |
| Auto CAD 2000 应用及实例基集锦 |
| MySQL |
| ASP数据库系统开发实例导航 |
| Delphi 5程序设计与控件参考 |
| 活学活用Delphi5 |
| Auto CAD 2002 中文版实用教程 |
| 精通Javascript |
| 深入Flash 5教程 |
| Auto CAD R14 中文版实用教程 |
| Frontpage 2000& ASP 网页设计技巧与网站维护 |
| HTML设计实务 |
| Javascript与Jscript从入门到精通 |
| lllustrator 9宝典 |
| MySQL |
| MySQL |
| ASP 3初级教程 |
| XML 完全探索 |
+---------------------------------------------------------+
39 rows in set (0.00 sec)

详解MariaDB数据库的事务的更多相关文章

  1. 详解MariaDB数据库的触发器

    1.什么是触发器 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行 它比数据库本身标准的功能有更精细和更复杂的数据控制能力 2.触发器的作用: 2.1 安全性 可以基于数据库的 ...

  2. 详解MariaDB数据库的存储过程

    1.什么是存储过程 很多时候,SQL语句都是针对一个或多个表的单条语句.但是也有时候有的查询语句需要进行多次联表查询才能完成,此时就需要用到存储过程了. 存储过程(Stored Procedure)是 ...

  3. 详解MariaDB数据库的外键约束

    1.什么是外键约束 外键约束(foreign key)就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强. 关于数据表的完整性和关连性,可以举个例子 ...

  4. 详解MariaDB数据库的索引

    1.什么是索引 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针. 更通俗的说,数据库索引好比是一本书前面的目录,在查找内容之前可以先在 ...

  5. mongo 3.4分片集群系列之六:详解配置数据库

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  6. MySQL/MariaDB数据库的事务和隔离级别

      MySQL/MariaDB数据库的事务和隔离级别 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.事务概述 1>.事务Transactions 一组原子性的SQL语句 ...

  7. [转帖]详解oracle数据库唯一主键SYS_GUID()

    详解oracle数据库唯一主键SYS_GUID() https://www.toutiao.com/i6728736163407856139/ 其实 需要注意 这里满不能截取 因为截取了 就不一定唯一 ...

  8. Redis详解(三)——事务

    Redis详解(三)--事务 Redis事务的概念: Redis 事务的本质是一组命令的集合.事务支持一次执行多个命令,一个事务中所有命令都会被序列化.在事务执行过程,会按照顺序串行化执行队列中的命令 ...

  9. Spring事务管理详解_基本原理_事务管理方式

    1. 事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交,那在没有Spring帮我们管理事 ...

随机推荐

  1. JQ倒计时,正计时

    <p class="lastP">距离二维码过期还剩<strong></strong>秒,过期后自动刷新页面.</p><scr ...

  2. 关于Eclipse使用Git基础篇

    一:Git的下载与安装与基本使用 1.打开eclipse->help->Eclipse Markplace->search->fiind输入Egit 你会看到如下截图(我的为已 ...

  3. NABCD--团队项目1

    N: 1.学校中有很多学生是外省的,然后不知道附近有什么地方周末可以去玩. 2.学校中学生有很多用不到的东西但是联系不到合适的买家. A: 我们可以做一个软件,通过学号注册登陆软件,这样可以防止有人去 ...

  4. python format() 函数

    转载 https://www.cnblogs.com/wushuaishuai/p/7687728.html 正文 Python2.6 开始,新增了一种格式化字符串的函数 format() ,它增强了 ...

  5. Educational Codeforces Round 62 Div. 2

    突然发现上一场edu忘记写了( A:签到. #include<iostream> #include<cstdio> #include<cmath> #include ...

  6. Forethought Future Cup - Elimination Round

    A:签到. #include<bits/stdc++.h> using namespace std; #define ll long long char getc(){char c=get ...

  7. Markdown 公式整理

    Cmd Markdown 公式指导手册 摘自:Cmd Markdown 公式指导手册 - 作业部落 Cmd Markdown 编辑阅读器 Cmd Markdown 简明语法手册 Cmd Markdow ...

  8. JSON.stringify的三个参数(转载)

    前段时间勾股有提到stringify是支持三个参数,刷新的了我的认知,后来查到文档才发现还真的是支持三个参数的. 参考资料: stringify stringify方法顾名思义,就是把JSON序列换, ...

  9. did not finish being created even after we waited 189 seconds or 61 attempts. And its status is downloading

    did not finish being created even after we waited 189 seconds or 61 attempts. And its status is down ...

  10. Miller_Rabbin&&Pollard_Rho 学习笔记

    占坑,待填 I Intro 首先我们考虑这样一个问题 给定一个正整数\(p(p<=1e8)\),请判断它是不是质数 妈妈我会试除法! 于是,我们枚举$ \sqrt p$ 以内的所有数,就可以非常 ...