数据库事务:(database transaction): 事务是由一组SQL语句组成的逻辑处理单元,一组事务中的SQL语句要不所有执行成功功;若是其中某一条执行失败,则这组SQL语句中已经执行的语句会回滚到这组SQL语句执行以前的状态。mysql
事务处理,能够确保非事务性单元的多个操做都能成功完成,不然不会更新数据资源。sql
数据库默认事务是自动提交的, 也就是发一条 sql 它就执行一条。若是想多条 sql 放在一个事务中执行,则须要使用事务进行处理。数据库
当咱们开启一个事务,而且没有提交,可使用 rollback 命令手动回滚事务。网络
优势:并发
经过将一组操做组成一个事务执行时,要么所有成功,要么所有失败的单元。 使程序更可靠,简化错误恢复。
例如,A用户给B用户转帐1000元,此时表如今SQL语句上,就是先更新A帐户在的余额,减去1000,而后再更新B帐户的余额,加上1000。以上操做对应数据库为两个update操做,这两个操做属于一个事物。不然,万一当数据库在减去A帐户上的钱,而还没来得及在B帐户加上1000时,数据库出现故障,此时就会出现这1000元钱消失的悲剧,这时数据库的事务就派上用场了。网站
事务是必须知足4个条件(ACID):设计
事务在执行时,要作到“要么不作,要么全作!”,就是说不容许事务只执行其中一部分。 即便由于故障而使事务不能完成,在rollback时也要消除对数据库的影响。
事务必须是使数据库从一个一致性状态变到另外一个一致性状态。一致性与原子性是密切相关的。 在事务开始以前和结束以后,数据库的完整性约束没有被破坏
一个事务的执行不能被其余事务干扰。 即一个事务内部的操做及使用的数据对并发的其余事务是隔离的,并发执行的各个事务之间不能互相干扰,这些经过锁来实现。
指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。 接下来的其余操做或故障(好比说宕机等)不该该对其有任何影响。
事务的ACID特性能够确保银行不会弄丢你的钱。而在应用逻辑中,要实现这点很是难,甚至能够说是不可能完成的任务。code
START TRANSACTION | BEGIN [WORK] 开启事务 COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] 提交当前事务,执行永久操做。 ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] 回滚当前事务到开始点,取消上一次开始点后的全部操做。 SAVEPOINT 名称 折返点
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)