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: 0Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0Query 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: 0MariaDB [book]> alter table books engine=innodb;        # 修改books数据表的引擎为InnoDB
Query OK, 39 rows affected (0.02 sec)
Records: 39  Duplicates: 0  Warnings: 0MariaDB [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: 0Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0Query 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: 0MariaDB [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)

转载于:https://www.cnblogs.com/renpingsheng/p/9610983.html

详解MariaDB数据库的事务相关推荐

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

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

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

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

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

    Spring事务管理详解_基本原理_事务管理方式 1. 事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象 ...

  4. 详解 Spring 声明式事务

    一.引言 Spring的事务机制包括声明式事务和编程式事务. 编程式事务管理:Spring推荐使用 TransactionTemplate,实际开发中使用声明式事务较多. 声明式事务管理:将我们从复杂 ...

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

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

  6. 【Android】Realm详解(Android 数据库Sqlite的完美替代者)

    介绍 Realm 是一个 MVCC (多版本并发控制)数据库,由Y Combinator公司在2014年7月发布一款支持运行在手机.平板和可穿戴设备上的嵌入式数据库,目标是取代SQLite. Real ...

  7. mysql explain详解_数据库mysql(1)——B+TREE索引原理

    一.B+Tree索引详解 1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构: #1.顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. #2.二叉树查找(bina ...

  8. php mysql source_详解MySQL数据库中有关source命令

    这篇文章主要介绍了MySQL 数据库 source 命令详解及实例的相关资料,需要的朋友可以参考下 MySQL 数据库 source 命令详解及实例 MySQL 数据库 source 命令,该命令是数 ...

  9. mysql 编辑数据库内容_详解mysql数据库增删改操作

    插入数据 insert into 表名(列名1,列名2,列名3) values(值1,值2,值3); insert into user(user_id,name,age) values(1,'nice ...

最新文章

  1. 《数学之美》第6章 信息的度量和作用
  2. 获取选中的radio
  3. 全球及中国第三方供应链管理行业发展状况与规模前景分析报告2022-2027年
  4. boost::hana::is_valid用法的测试程序
  5. hadoop_namenode如果选择在哪个datanode存储副本
  6. 安装oracle解压版,oracle11g压缩解压版图文安装详细教程
  7. Linux系统安装Apache 2.4.6
  8. Android端实时音视频开发指南
  9. A20成功驱动FT5206触摸屏
  10. leetcode 144 --- 二叉树前序遍历
  11. paip.mysql 性能测试 报告 home right
  12. MATLAB绘制椭圆
  13. 非线性系统【三】LaSalle不变原理
  14. matlab中用simulink仿真六足机器人
  15. 蓝桥杯2021年第十二届真题第一场-双向排序
  16. 苹果手机内屏幕出现彩色条纹怎么办
  17. 高带宽数字内容保护( HDCP )介绍
  18. 工作室转型做什么好项目?
  19. ConvNeXt网络详解
  20. 创建型模式-抽象工厂模式

热门文章

  1. 以太网的分层架构_读《企业应用架构模式》记录-分层
  2. Python基本操作(三)标准运算符与赋值
  3. oracle11g设置数据库归档,oracle_Oracle11g RAC开启关闭、设置归档小结,关闭 1.先关数据库: 复制代 - phpStudy...
  4. 学校计算机考察内容是什么意思,2019考研计算机复试四项考察内容分析及注意事项...
  5. mysql如何大矩阵_如何打印矩阵
  6. Nginx rewrite规则整理
  7. 独木舟上的旅行(贪心)
  8. HDU-简易版之最短距离(最短路)
  9. CSDN怎样编辑公式
  10. 解决sublime text3 v3.1.1,Build3176中的汉字形状扭曲问题