數據庫事務:(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)