MYSQL 事務處理主要有兩種方法:
1、用 BEGIN, ROLLBACK, COMMIT來實現
- BEGIN 開始一個事務
- ROLLBACK 事務回滾
- COMMIT 事務確認
2、直接用 SET 來改變 MySQL 的自動提交模式:
- SET AUTOCOMMIT=0 禁止自動提交
- SET AUTOCOMMIT=1 開啟自動提交
對於一個MYSQL數據庫(InnoDB),事務的開啟與提交模式無非下面這兩種情況:
1>若參數autocommit=0,事務則在用戶本次對數據進行操作時自動開啟,在用戶執行commit命令時提交,用戶本次對數據庫開始進行操作到用戶執行commit命令之間的一系列操作為一個完整的事務周期。若不執行commit命令,系統則默認事務回滾。總而言之,當前情況下事務的狀態是自動開啟手動提交。
2>若參數autocommit=1(系統默認值),事務的開啟與提交又分為兩種狀態:
①手動開啟手動提交:當用戶執行start transaction命令時(事務初始化),一個事務開啟,當用戶執行commit命令時當前事務提交。從用戶執行start transaction命令到用戶執行commit命令之間的一系列操作為一個完整的事務周期。若不執行commit命令,系統則默認事務回滾。
②自動開啟自動提交:如果用戶在當前情況下(參數autocommit=1)未執行start transaction命令而對數據庫進行了操作,系統則默認用戶對數據庫的每一個操作為一個孤立的事務,也就是說用戶每進行一次操作系都會即時提交或者即時回滾。這種情況下用戶的每一個操作都是一個完整的事務周期。
<?php $dbhost = 'localhost:3306'; // mysql服務器主機地址 $dbuser = 'root'; // mysql用戶名 $dbpass = '123456'; // mysql用戶名密碼 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('連接失敗: ' . mysqli_error($conn)); } // 設置編碼,防止中文亂碼 mysqli_query($conn, "set names utf8"); mysqli_select_db( $conn, 'RUNOOB' ); mysqli_query($conn, "SET AUTOCOMMIT=0"); // 設置為不自動提交,因為MYSQL默認立即執行 mysqli_begin_transaction($conn); // 開始事務定義 if(!mysqli_query($conn, "insert into runoob_transaction_test (id) values(8)")) { mysqli_query($conn, "ROLLBACK"); // 判斷當執行失敗時回滾 } if(!mysqli_query($conn, "insert into runoob_transaction_test (id) values(9)")) { mysqli_query($conn, "ROLLBACK"); // 判斷執行失敗時回滾 } mysqli_commit($conn); //執行事務 mysqli_close($conn); ?>
Django的事務開啟兩種方式
#第一種 導入模塊 from django.db import transaction with transaction.atomic(): ... #第二種 裝飾器 @transaction.atomic def post(self,request): ... sid=transaction.savepoint() #開啟事務 ... transaction.savepoint_rollback(sid) # 回滾 ... transaction.savepoint_commit(sid) # 提交