详解MariaDB数据库的事务

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)

原文地址:https://www.cnblogs.com/renpingsheng/p/9610983.html

时间: 2024-10-09 08:20:27

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

详解MariaDB数据库的索引

1.什么是索引 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针. 更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 2.索引的类型 1.普通索引 2.唯一性索引 3.主键索引(主索引) 4.复合索引 2.1. 普通索引 最基本的索引,不具备唯一性,就是加快查询速度 2.1.1 创建普通索引 方法一:创建表时添加索引 语法: create table 表名( 列定义 index 索引名称 (字段) index

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

这个系列大致想跟大家分享以下篇章(我会持续更新的(^ω^)): 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全 4.mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域 5.mongo 3.4分片集群系列之五:详解平衡器 6.mongo 3.4分片集群系列之六:详解配置数据库 7.mongo 3.4分片集群系列之七:配置数

一篇文章详解NOsql数据库Redis

一图详解DB的分支产品osql数据库介绍 是一种非关系型数据库服务,它能解决常规数据库的并发能力,比如传统的数据库的IO与性能的瓶颈,同样它是关系型数据库的一个补充,有着比较好的高效率与高性能. 专注于key-value查询的redis.memcached.ttserver 解决以下问题: 1)对数据库的高并发读写需求2)大数据的高效存储和访问需求3)高可扩展性和高可用性的需求Nosql数据库的应用环境 1)数据模型比较简单2)需要灵活性更强的IT系统3)对数据库的性能要求较高4)不需要高度数据

[数据库事务与锁]详解四: 数据库的锁机制

注明: 本文转载自http://www.hollischuang.com/archives/898 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数据库都提供了锁机制,并引入了事务隔离级别的概念. 并发控制 在计算机科学,特别是程序设计.操作系统.多处理机和数据库等领域,并发控制(Concurrency control)是确保及时纠正由并发操作导致的错误的一种机制. 数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存

[数据库事务与锁]详解二: 数据库的读现象浅析

注明: 本文转载自http://www.hollischuang.com/archives/900 “读现象”是多个事务并发执行时,在读取数据方面可能碰到的状况.先了解它们有助于理解各隔离级别的含义.其中包括脏读.不可重复读和幻读. 脏读 脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的. 脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交(commit)到

MySQL详解(13)------------事务

一. 什么是事务 事务就是一段sql 语句的批处理,但是这个批处理是一个atom(原子) ,不可分割,要么都执行,要么回滚(rollback)都不执行. 二.为什么出现这种技术 为什么要使用事务这个技术呢? 现在的很多软件都是多用户,多程序,多线程的,对同一个表可能同时有很多人在用,为保持数据的一致性,所以提出了事务的概念.这样很抽象,举个例子: A 给B 要划钱,A 的账户-1000元, B 的账户就要+1000元,这两个update 语句必须作为一个整体来执行,不然A 扣钱了,B 没有加钱这

详解NoSQL数据库使用实例

一.NoSQL基础知识 1.关于NoSQL 在"NoSQL"一词,实际上是一个叫Racker的同事创造的,当约翰埃文斯埃里克要组织一次活动来讨论开源的分布式数据库.这个名称和概念都由此而来. 有些人反对NoSQL术语,因为它听起来像我们定义自己是什么.在一定程度,但长期仍然是有价值的,因为当一个关系数据库是唯一的工具,你知道,每一个问题,看起来像一个大拇指. NoSQL是让人们知道有其他选择哪里.但我们并不反对关系数据库,因为当这确实是工作的最佳工具. 一个与NoSQL名称真正关注的是

5 详解MySQL数据库之更新语句

用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的 SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之 意,就是对数据进行修改.在标准的SQL中有3个语句,它们是INSERT.UPDATE以及DELETE.在MySQL中又多了一个REPLACE语句,因此,本文以MySQL为背景来讨论如何使有SQL中的更新语句. 一.INSERT和REPLACE INSERT和REPLACE语句的功能都是向表中插入新的数据.这两条语句的语法类似.它们的主要区别是如何处理重复的数据

【转】详解:oracle10G 数据库名、实例名、ORACLE_SID

[转载] 数据库名.实例名.数据库域名.全局数据库名.服务名 ,这是几个令很多初学者容易混淆的概念.相信很多初学者都与我一样被标题上这些个概念搞得一头雾水.我们现在就来把它们弄个明白. 一.数据库名什么是数据库名?数据库名就是一个数据库的标识,就像人的身份证号一样.他用参数DB_NAME表示,如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名.在数据库安装或创建完成之后,参数DB_NAME被写入参数文件之中.格式如下:DB_NAME=myorcl...在创建数据库时就应考虑好数据库名