MYSQL事務的開啟與提交


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)  # 提交

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM