详解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)
详解MariaDB数据库的事务的更多相关文章
- 详解MariaDB数据库的触发器
1.什么是触发器 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行 它比数据库本身标准的功能有更精细和更复杂的数据控制能力 2.触发器的作用: 2.1 安全性 可以基于数据库的 ...
- 详解MariaDB数据库的存储过程
1.什么是存储过程 很多时候,SQL语句都是针对一个或多个表的单条语句.但是也有时候有的查询语句需要进行多次联表查询才能完成,此时就需要用到存储过程了. 存储过程(Stored Procedure)是 ...
- 详解MariaDB数据库的外键约束
1.什么是外键约束 外键约束(foreign key)就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强. 关于数据表的完整性和关连性,可以举个例子 ...
- 详解MariaDB数据库的索引
1.什么是索引 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针. 更通俗的说,数据库索引好比是一本书前面的目录,在查找内容之前可以先在 ...
- mongo 3.4分片集群系列之六:详解配置数据库
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- MySQL/MariaDB数据库的事务和隔离级别
MySQL/MariaDB数据库的事务和隔离级别 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.事务概述 1>.事务Transactions 一组原子性的SQL语句 ...
- [转帖]详解oracle数据库唯一主键SYS_GUID()
详解oracle数据库唯一主键SYS_GUID() https://www.toutiao.com/i6728736163407856139/ 其实 需要注意 这里满不能截取 因为截取了 就不一定唯一 ...
- Redis详解(三)——事务
Redis详解(三)--事务 Redis事务的概念: Redis 事务的本质是一组命令的集合.事务支持一次执行多个命令,一个事务中所有命令都会被序列化.在事务执行过程,会按照顺序串行化执行队列中的命令 ...
- Spring事务管理详解_基本原理_事务管理方式
1. 事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交,那在没有Spring帮我们管理事 ...
随机推荐
- FTP设置用户名和密码
第一步新建用户: 1.电脑右键管理--> 2.本地用户和组--> 3.新建用户,设置密码成功 第二步:开启FTP服务 1.控制面板-->程序-->启用或关闭Windows功能- ...
- 快速去水印(win10换图3D工具)
之前抠图都用ps啥的,后来发现win10自带的工具画图3D可以直接扣简单的图案,达到去水印的效果 1.将图片放入软件中 2.使用神奇选择工具,调整大小,框出图标 3.点击下一步,将没选上的或选多的进行 ...
- 【转】C语言堆栈入门——堆和栈的区别
@2019-04-25 [小记] C语言堆栈入门——堆和栈的区别
- python并发编程之多线程基础知识点
1.线程理论知识 概念:指的是一条流水线的工作过程的总称,是一个抽象的概念,是CPU基本执行单位. 进程和线程之间的区别: 1. 进程仅仅是一个资源单位,其中包含程序运行所需的资源,而线程就相当于车间 ...
- iis7设置ftp
目前是所有网站一个域下.ftp登录后可看到所有网站,目前想ftp一个网站,查看了下服务器,貌似只有serv-u这么个东西,还不能再创建第二个域.不得其解.百度发现两篇文章正好: http://blog ...
- 把xlsx变成CSV
import pandas as pd import numpy as np import matplotlib.pyplot as plt #df.to_excel('C:/Users/Asus/D ...
- es6异步编程
https://blog.csdn.net/tcy83/article/details/80274772 等一系列文章
- win10 右下角显示秒
点击Contana搜索框,输入“regedit”打开注册表编辑器: 查找:HKEY_CURRENT_USER/SOFTWARE/Microsoft/Windows/CurrentVersion/Exp ...
- 2018-2019-2 网络对抗技术 20165232 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165232 Exp3 免杀原理与实践 免杀原理及基础问题回答 一.免杀原理 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. ...
- IPv4 forwarding is disabled. Networking will not work_问题解决
构建Docker镜像时遇见的问题,特做以下记录: 1.编辑 vi /etc/sysctl.conf 2.添加 net.ipv4.ip_forward=1 3.重启network服务 systemctl ...