詳解MariaDB數據庫的事務

1.什麼是事務

數據庫事務:(database transaction): 事務是由一組SQL語句組成的邏輯處理單元,一組事務中的SQL語句要不所有執行成功功;若是其中某一條執行失敗,則這組SQL語句中已經執行的語句會回滾到這組SQL語句執行以前的狀態。mysql

事務處理,能夠確保非事務性單元的多個操做都能成功完成,不然不會更新數據資源。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特性能夠確保銀行不會弄丟你的錢。而在應用邏輯中,要實現這點很是難,甚至能夠說是不可能完成的任務。code

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)
相關文章
相關標籤/搜索