在缺省模式下,MYSQL是autocommit模式的,所有的數(shù)據(jù)庫更新操作都會即時提交,所以在缺省情況下,mysql是不支持事務的。
創(chuàng)新互聯(lián)是專業(yè)的芒市網(wǎng)站建設公司,芒市接單;提供做網(wǎng)站、網(wǎng)站建設,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行芒市網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
但是如果你的MYSQL表類型是使用InnoDB Tables 或 BDB tables的話,你的MYSQL就可以使用事務處理,使用SET AUTOCOMMIT=0就可以使MYSQL允許在非autocommit模式,
在非autocommit模式下,你必須使用COMMIT來提交你的更改,或者用ROLLBACK來回滾你的更改。示例如下:
START TRANSACTION;
什么是事務? \x0d\x0a\x0d\x0a事務是邏輯上的一組操作,組成這組操作的各個單元,要不全都成功要不全都失敗,這個特性就是事務 \x0d\x0a\x0d\x0a注意:mysql數(shù)據(jù)支持事務,但是要求必須是innoDB存儲引擎 \x0d\x0a\x0d\x0a解決這個問題: \x0d\x0a\x0d\x0amysql的事務解決這個問題,因為mysql的事務特性,要求這組操作,要不全都成功,要不全都失敗,這樣就避免了某個操作成功某個操作失敗。利于數(shù)據(jù)的安全 \x0d\x0a\x0d\x0a如何使用: \x0d\x0a\x0d\x0a(1)在執(zhí)行sql語句之前,我們要開啟事務 start transaction; \x0d\x0a\x0d\x0a(2)正常執(zhí)行我們的sql語句 \x0d\x0a\x0d\x0a(3)當sql語句執(zhí)行完畢,存在兩種情況: \x0d\x0a\x0d\x0a1,全都成功,我們要將sql語句對數(shù)據(jù)庫造成的影響提交到數(shù)據(jù)庫中,committ \x0d\x0a\x0d\x0a2,某些sql語句失敗,我們執(zhí)行rollback(回滾),將對數(shù)據(jù)庫操作趕緊撤銷 \x0d\x0a\x0d\x0a(注意:mysql數(shù)據(jù)支持事務,但是要求必須是innoDB存儲引擎) \x0d\x0amysql create table bank(name varchar(20),money decimal(5,1))engine=innodb defau \x0d\x0alt charset=utf8; \x0d\x0a\x0d\x0amysql inset into bank values('shaotuo',1000),('laohu',5000); \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1000.0 | \x0d\x0a| laohu | 5000.0 | \x0d\x0a+---------+--------+ \x0d\x0a\x0d\x0a------沒有成功“回滾”執(zhí)行rollback \x0d\x0amysql start transaction; //開啟事務 \x0d\x0aQuery OK, 0 rows affected (0.00 sec) \x0d\x0a\x0d\x0amysql update bank set money=money+500 where name='shaotuo'; \x0d\x0aQuery OK, 1 row affected (0.00 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql update bank set moey=money-500 where name='laohu'; \x0d\x0aERROR 1054 (42S22): Unknown column 'moey' in 'field list' \x0d\x0amysql rollback; //只要有一個不成功,執(zhí)行rollback操作 \x0d\x0aQuery OK, 0 rows affected (0.01 sec) \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1000.0 | \x0d\x0a| laohu | 5000.0 | \x0d\x0a+---------+--------+ \x0d\x0a------成功之后 進行commit操作 \x0d\x0amysql start transaction; //開啟事務 \x0d\x0aQuery OK, 0 rows affected (0.00 sec) \x0d\x0a\x0d\x0amysql update bank set money=money+500 where name='shaotuo'; \x0d\x0aQuery OK, 1 row affected (0.01 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql update bank set money=money-500 where name='laohu'; \x0d\x0aQuery OK, 1 row affected (0.00 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql commit; //兩個都成功后執(zhí)行commit(只要不執(zhí)行commit,sql語句不會對真實的數(shù)據(jù)庫造成影響) \x0d\x0aQuery OK, 0 rows affected (0.05 sec) \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1500.0 | \x0d\x0a| laohu | 4500.0 | \x0d\x0a+---------+--------+
1. 普通事務
以 begin / start transaction 開始,commit / rollback 結(jié)束的事務?;蛘呤菐в斜4纥c savepoint 的事務。
2. 鏈式事務
一個事務在提交的時候自動將上下文傳給下一個事務,也就是說一個事務的提交和下一個事務的開始是原子性的,下一個事務可以看到上一個事務的處理結(jié)果。MySQL 的鏈式事務靠參數(shù) completion_type 控制,并且回滾和提交的語句后面加上 work 關(guān)鍵詞。
3. 嵌套事務
有多個 begin / commit / rollback 這樣的事務塊的事務,并且有父子關(guān)系。子事務的提交完成后不會真的提交,而是等到父事務提交才真正的提交。
4. 自治事務
內(nèi)部事務的提交不隨外部事務的影響,一般用作記錄內(nèi)部事務的異常情況。MySQL 不支持自治事務,但是某些場景可以用 MySQL 的插件式引擎來變相實現(xiàn)。