• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    mysql事務處理用法與實例代碼詳解

    來源:懂視網(wǎng) 責編:小采 時間:2020-11-09 20:21:05
    文檔

    mysql事務處理用法與實例代碼詳解

    mysql事務處理用法與實例代碼詳解:MySQL的事務支持不是綁定在MySQL服務器本身,而是與存儲引擎相關 1.MyISAM:不支持事務,用于只讀程序提高性能 2.InnoDB:支持ACID事務、行級鎖、并發(fā) 3.Berkeley DB:支持事務 一個事務是一個連續(xù)的一組數(shù)據(jù)庫操作,就好像它是一個單一的工作單元進行。換
    推薦度:
    導讀mysql事務處理用法與實例代碼詳解:MySQL的事務支持不是綁定在MySQL服務器本身,而是與存儲引擎相關 1.MyISAM:不支持事務,用于只讀程序提高性能 2.InnoDB:支持ACID事務、行級鎖、并發(fā) 3.Berkeley DB:支持事務 一個事務是一個連續(xù)的一組數(shù)據(jù)庫操作,就好像它是一個單一的工作單元進行。換

    MySQL的事務支持不是綁定在MySQL服務器本身,而是與存儲引擎相關

    1.MyISAM:不支持事務,用于只讀程序提高性能
    2.InnoDB:支持ACID事務、行級鎖、并發(fā)
    3.Berkeley DB:支持事務

    一個事務是一個連續(xù)的一組數(shù)據(jù)庫操作,就好像它是一個單一的工作單元進行。換言之,永遠不會是完整的事務,除非該組內(nèi)的每個單獨的操作是成功的。如果在事務的任何操作失敗,則整個事務將失敗。
    實際上,會俱樂部許多SQL查詢到一個組中,將執(zhí)行所有的人都一起作為事務的一部分。

    事務的特性:

    事務有以下四個標準屬性的縮寫ACID,通常被稱為:

    原子性: 確保工作單元內(nèi)的所有操作都成功完成,否則事務將被中止在故障點,和以前的操作將回滾到以前的狀態(tài)。

    一致性: 確保數(shù)據(jù)庫正確地改變狀態(tài)后,成功提交的事務。

    隔離性: 使事務操作彼此獨立的和透明的。

    持久性: 確保提交的事務的結(jié)果或效果的系統(tǒng)出現(xiàn)故障的情況下仍然存在。

    在MySQL中,事務開始使用COMMIT或ROLLBACK語句開始工作和結(jié)束。開始和結(jié)束語句的SQL命令之間形成了大量的事務。

    COMMIT & ROLLBACK:

    這兩個關鍵字提交和回滾主要用于MySQL的事務。

    當一個成功的事務完成后,發(fā)出COMMIT命令應使所有參與表的更改才會生效。

    如果發(fā)生故障時,應發(fā)出一個ROLLBACK命令返回的事務中引用的每一個表到以前的狀態(tài)。

    可以控制的事務行為稱為AUTOCOMMIT設置會話變量。如果AUTOCOMMIT設置為1(默認值),然后每一個SQL語句(在事務與否)被認為是一個完整的事務,并承諾在默認情況下,當它完成。 AUTOCOMMIT設置為0時,發(fā)出SET AUTOCOMMIT =0命令,在隨后的一系列語句的作用就像一個事務,直到一個明確的COMMIT語句時,沒有活動的提交。

    可以通過使用mysql_query()函數(shù)在PHP中執(zhí)行這些SQL命令。

    通用事務例子

    這一系列事件是獨立于所使用的編程語言,可以建立在任何使用的語言來創(chuàng)建應用程序的邏輯路徑。

    可以通過使用mysql_query()函數(shù)在PHP中執(zhí)行這些SQL命令。

    BEGIN WORK開始事務發(fā)出SQL命令

    發(fā)出一個或多個SQL命令,如SELECT,INSERT,UPDATE或DELETE

    檢查是否有任何錯誤,一切都依據(jù)的需要。

    如果有任何錯誤,那么問題ROLLBACK命令,否則發(fā)出COMMIT命令。

    在MySQL中的事務安全表類型:

    如果打算使用MySQL事務編程,那么就需要一種特殊的方式創(chuàng)建表。有很多支持事務但最流行的是InnoDB表類型。

    從源代碼編譯MySQL時,InnoDB表支持需要特定的編譯參數(shù)。如果MySQL版本沒有InnoDB支持,請互聯(lián)網(wǎng)服務提供商建立一個版本的MySQL支持InnoDB表類型,或者下載并安裝Windows或Linux/UNIX的MySQL-Max二進制分發(fā)和使用的表類型在開發(fā)環(huán)境中。

    如果MySQL安裝支持InnoDB表,只需添加一個的TYPE=InnoDB 定義表創(chuàng)建語句。例如,下面的代碼創(chuàng)建InnoDB表tcount_tbl:

    root@host# mysql -u root -p password;
    Enter password:*******
    mysql> use TUTORIALS;
    Database changed
    mysql> create table tcount_tbl
     -> (
     -> tutorial_author varchar(40) NOT NULL,
     -> tutorial_count INT
     -> ) TYPE=InnoDB;
    Query OK, 0 rows affected (0.05 sec)
    
    

    可以使用其他GEMINI或BDB表類型,但它取決于您的安裝,如果它支持這兩種類型。

    由于項目設計里面,牽扯到了金錢的轉(zhuǎn)移,于是就要用到MYSQL的事務處理,來保證一組處理結(jié)果的正確性。用了事務,就不可避免的要犧牲一部分速度,來保證數(shù)據(jù)的正確性。

    只有InnoDB支持事務

    事務 ACID Atomicity(原子性)、Consistency(穩(wěn)定性)、Isolation(隔離性)、Durability(可靠性)

    1、事務的原子性
    一組事務,要么成功;要么撤回。

    2、穩(wěn)定性
    有非法數(shù)據(jù)(外鍵約束之類),事務撤回。

    3、隔離性
    事務獨立運行。
    一個事務處理后的結(jié)果,影響了其他事務,那么其他事務會撤回。
    事務的100%隔離,需要犧牲速度。

    4、可靠性
    軟、硬件崩潰后,InnoDB數(shù)據(jù)表驅(qū)動會利用日志文件重構修改。
    可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit選項 決定什么時候吧事務保存到日志里。

    開啟事務

    START TRANSACTION 或 BEGIN

    提交事務(關閉事務)

    COMMIT

    放棄事務(關閉事務)

    ROLLBACK

    折返點

    SAVEPOINT adqoo_1
    ROLLBACK TO SAVEPOINT adqoo_1

    發(fā)生在折返點 adqoo_1 之前的事務被提交,之后的被忽略

    事務的終止

    設置“自動提交”模式
    SET AUTOCOMMIT = 0
    每條SQL都是同一個事務的不同命令,之間由 COMMIT 或 ROLLBACK隔開
    掉線后,沒有 COMMIT 的事務都被放棄

    事務鎖定模式

    系統(tǒng)默認: 不需要等待某事務結(jié)束,可直接查詢到結(jié)果,但不能再進行修改、刪除。
    缺點:查詢到的結(jié)果,可能是已經(jīng)過期的。
    優(yōu)點:不需要等待某事務結(jié)束,可直接查詢到結(jié)果。

    需要用以下模式來設定鎖定模式

    1、SELECT …… LOCK IN SHARE MODE(共享鎖)
    查詢到的數(shù)據(jù),就是數(shù)據(jù)庫在這一時刻的數(shù)據(jù)(其他已commit事務的結(jié)果,已經(jīng)反應到這里了)
    SELECT 必須等待,某個事務結(jié)束后才能執(zhí)行

    2、SELECT …… FOR UPDATE(排它鎖)
    例如 SELECT * FROM tablename WHERE id<200
    那么id<200的數(shù)據(jù),被查詢到的數(shù)據(jù),都將不能再進行修改、刪除、SELECT …… LOCK IN SHARE MODE操作
    一直到此事務結(jié)束
    共享鎖 和 排它鎖 的區(qū)別:在于是否阻斷其他客戶發(fā)出的 SELECT …… LOCK IN SHARE MODE命令

    3、INSERT / UPDATE / DELETE
    所有關聯(lián)數(shù)據(jù)都會被鎖定,加上排它鎖

    4、防插入鎖
    例如 SELECT * FROM tablename WHERE id>200
    那么id>200的記錄無法被插入

    5、死鎖
    自動識別死鎖
    先進來的進程被執(zhí)行,后來的進程收到出錯消息,并按ROLLBACK方式回滾
    innodb_lock_wait_timeout = n 來設置最長等待時間,默認是50秒

    事務隔離模式

    SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL
    READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE

    1、不帶SESSION、GLOBAL的SET命令
    只對下一個事務有效

    2、SET SESSION
    為當前會話設置隔離模式

    3、SET GLOBAL
    為以后新建的所有MYSQL連接設置隔離模式(當前連接不包括在內(nèi))
    隔離模式
       READ UNCOMMITTED
    不隔離SELECT
    其他事務未完成的修改(未COMMIT),其結(jié)果也考慮在內(nèi)
       READ COMMITTED
    把其他事務的 COMMIT 修改考慮在內(nèi)
    同一個事務中,同一 SELECT 可能返回不同結(jié)果
       REPEATABLE READ(默認)
    不把其他事務的修改考慮在內(nèi),無論其他事務是否用COMMIT命令提交過
    同一個事務中,同一 SELECT 返回同一結(jié)果(前提是本事務,不修改)
       SERIALIZABLE
    和REPEATABLE READ類似,給所有的SELECT都加上了 共享鎖

    出錯處理

    根據(jù)出錯信息,執(zhí)行相應的處理

    mysql事物處理實例

    MYSQL的事務處理主要有兩種方法

    1.用begin,rollback,commit來實現(xiàn)

  • begin開始一個事務
  • rollback事務回滾
  • commit 事務確認
  • 2.直接用set來改變mysql的自動提交模式

  • mysql默認是自動提交的,也就是你提交一個query,就直接執(zhí)行!可以通過
  • set autocommit = 0 禁止自動提交
  • set autocommit = 1 開啟自動提交
  • 來實現(xiàn)事務的處理。

    但要注意當用set autocommit = 0 的時候,你以后所有的sql都將作為事務處理,直到你用commit確認或 rollback結(jié)束,注意當你結(jié)束這個事務的同時也開啟了新的事務!按第一種方法只將當前的做為一個事務!

    MYSQL只有 INNODB和BDB類型的數(shù)據(jù)表才支持事務處理,其他的類型是不支持的!

    mysql> use test;
     Database changed
     mysql> CREATE TABLE `dbtest`(
     -> id int(4)
     -> ) TYPE=INNODB;
    Query OK, 0 rows affected, 1 warning (0.05 sec)
    
    mysql> select * from dbtest
     -> ;
    Empty set (0.01 sec)
    
    mysql> begin;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> insert into dbtest values(5);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into dbtest value(6);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> commit;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from dbtest;
    +------+
    | id |
    +------+
    | 5 |
    | 6 |
    +------+
    2 rows in set (0.00 sec)
    
    mysql> begin;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> insert into dbtest values(7);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> rollback;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from dbtest;
    +------+
    | id |
    +------+
    | 5 |
    | 6 |
    +------+
    2 rows in set (0.00 sec)
    
    

    mysql事務處理

    php代碼實現(xiàn)事務的處理可以通過PHP預定義類mysqli的以下方法實現(xiàn)。

  • autocommit(boolean):該方法用于限定查詢結(jié)果是否自動提交,如果該方法的參數(shù)為true則自動提交,如果參數(shù)為false則關閉自動提交。MySQL數(shù)據(jù)庫默認為自動提交。
  • rollback():利用mysqli類中的該方法可以實現(xiàn)事務的回滾。
  • commit():利用該方法可以實現(xiàn)提交所有查詢。
  • <?php
    include_once("conn.php");
    
    $id=$_GET[id];
    $conn->autocommit(false);
    if(!$conn->query("delete from tb_sco where id='".$id."'"))
    {
     $conn->rollback();
    }
    if(!$conn->query("delete from tb_stu where id='".$id."'"))
    {
     $conn->rollback();
    }
     $conn->commit();
     $conn->autocommit(true);
     echo "ok"
    ?>
    
    
    <?php
    require('connectDB.php'); //建立數(shù)據(jù)庫連接
    mssql_query("BEGIN TRANSACTION DEPS02_DEL"); //開始事務
    $delete_dep_sql="DELETE FROM TBLDEPARTMENT WHERE DEPTID='{$_GET[deptid]}'";
    // echo $delete_dep_sql."<br>";
    mssql_query($delete_dep_sql); //操作數(shù)據(jù)庫
    // var_dump($del_result);
    $delete_result = mssql_query("select @@ROWCOUNT as id");
    $delete_info = mssql_fetch_array($delete_result);
    $delete_rows = $delete_info[0];
    // var_dump($delete_rows);
    mssql_free_result($delete_result);
    echo "<script language=javascript>";
    if(true){ //判斷是否回滾提交
    mssql_query("COMMIT TRANSACTION DEPS02_DEL"); //提交事務
    echo "alert('delete success!');";
    }else{
    mssql_query("ROLLBACK TRANSACTION DEPS02_DEL"); //回滾事務
    echo "alert('delete faile!');";
    }
    echo "</script>";mssql_close();
    ?>

    MySQL的事務處理在處理實際問題中有著廣泛且重要的應用,最常見的應用如銀行轉(zhuǎn)賬業(yè)務、電子商務支付業(yè)務等等。但是,值得注意的是,MySQL的事務處理功能在MYSIAM存儲引擎中是不支持的,在InnoDB存儲引擎中是支持的。現(xiàn)在上傳一段代碼,作為引導認識MySQL事務處理的開始,簡單的實例,但融匯思想,相信會有很大的幫助。

    <?php
    $conn=mysql_connect('localhost','root','yourpassword')or die(mysql_error());
    mysql_select_db('transaction',$conn);
    mysql_query('set names utf8');
    
    //創(chuàng)建事務
    mysql_query('START TRANSACTION') or die(mysql_error());
    $sqlA="update A set account=account-1";
    if(!mysql_query($sqlA)){
        mysql_query('ROLLBACK') or exit(mysql_error());//判斷當執(zhí)行失敗時回滾
      exit();
    }
    $sqlB="update B set account=account+1";
    if(!mysql_query($sqlB)){
        mysql_query('ROLLBACK') or exit(mysql_error());//判斷當執(zhí)行失敗時回滾
      exit();
    }
    mysql_query('COMMIT')or die(mysql_error());//執(zhí)行事務
    mysql_close($conn);
    ?>

    以上代碼可以作為模擬銀行轉(zhuǎn)賬業(yè)務的事務流程。以表A、B分別表示兩個已在銀行開戶的賬戶,當賬戶A執(zhí)行轉(zhuǎn)出1元給賬戶B的操作時,如果操作執(zhí)行失敗,轉(zhuǎn)出將會回滾至原始狀態(tài),不繼續(xù)向下執(zhí)行動作。反之,如果操作執(zhí)行成功,則賬戶B可用余額將增加1元,否則事務回滾至原始狀態(tài)。

    希望本文所述對你有所幫助,mysql事務處理用法與實例代碼內(nèi)容就給大家介紹到這里了。希望大家繼續(xù)關注我們的網(wǎng)站!想要學習mysql可以繼續(xù)關注本站。

    您可能感興趣的文章:

  • Java實現(xiàn)的mysql事務處理操作示例
  • PHP+MySQL高并發(fā)加鎖事務處理問題解決方法
  • Mysql事務處理詳解
  • NodeJs使用Mysql模塊實現(xiàn)事務處理實例
  • php下pdo的mysql事務處理用法實例
  • php實現(xiàn)mysql事務處理的方法
  • MySQL事務處理與應用簡析
  • mysql 事務處理及表鎖定深入簡析
  • 聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    mysql事務處理用法與實例代碼詳解

    mysql事務處理用法與實例代碼詳解:MySQL的事務支持不是綁定在MySQL服務器本身,而是與存儲引擎相關 1.MyISAM:不支持事務,用于只讀程序提高性能 2.InnoDB:支持ACID事務、行級鎖、并發(fā) 3.Berkeley DB:支持事務 一個事務是一個連續(xù)的一組數(shù)據(jù)庫操作,就好像它是一個單一的工作單元進行。換
    推薦度:
    標簽: 代碼 mysql 事務
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品99久久免费观看| 精品欧洲av无码一区二区三区| 鲸鱼传媒绿头鱼实验室之炮机测评日韩精品一级毛 | 国产成人精品视频2021| 色欲国产麻豆一精品一AV一免费 | 好吊妞视频精品| 亚洲精品~无码抽插| 国产欧美日韩精品专区| 国产精品久久久福利| 久久久精品日本一区二区三区| 成人区人妻精品一区二区不卡网站| 日本一区二区三区精品国产| 国产麻豆一精品一AV一免费| 欧美国产成人精品一区二区三区| 久久伊人精品青青草原高清| 精品无码久久久久久尤物| 国产午夜精品一区理论片| 国产精品成人观看视频| 亚洲国产精品一区二区久久| 久久夜色精品国产网站| 亚洲综合无码精品一区二区三区| 欧洲精品一区二区三区在线观看| 精品精品国产理论在线观看| 国产欧美精品专区一区二区| 国产亚洲色婷婷久久99精品91| 国产成人亚洲精品91专区手机| 日韩精品一区二区三区大桥未久| 久久国产精品99精品国产987| 久久精品一区二区三区不卡| 久久久久免费精品国产| 98香蕉草草视频在线精品看| 99久久国产主播综合精品| 国产精品热久久无码av| 精品无码专区亚洲| 青草国产精品视频。| 无码日韩精品一区二区人妻| 一本一本久久A久久综合精品| 久久久久国产精品熟女影院| 国产精品丝袜黑色高跟鞋| 97久久精品国产精品青草| 久久精品国产亚洲综合色|