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)
