详解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引擎不⽀持事务操作,所以要到book *************************** 1. row ***************************
Table: books
Create Table: CREATE 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模型⼤师 |
| 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)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论