日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL事务控制语句

發布時間:2024/1/17 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL事务控制语句 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?
??????? 在mysql命令行的默認下,事務都是自動提交的,sql語句提交后馬上會執行commit操作。因此開啟一個事務必須使用begin,start transaction,或者執行 set autocommit=0;
?可以使用的事務控制語句

start transction | begin : 顯示的開啟一個事務
?commit (commit work)
??? commit work與completion_type的關系,commit work是用來控制事務結束后的行為,是chain還是release的,可以通過參數completion_type來控制,默認為0(或者NO_CHAIN),表示沒有任何操作?與commit效果一樣。當completion_type=1的時候

?

?

[sql]?view plaincopy
  • mysql>?set?names?utf8;??
  • Query?OK,?0?rows?affected?(0.00?sec)??
  • ??
  • mysql>?create?table?t(a?int,?primary?key?(a))engine=innodb;??
  • Query?OK,?0?rows?affected?(0.29?sec)??
  • ??
  • mysql>?select?@@autocommit;??
  • +--------------+??
  • |?@@autocommit?|??
  • +--------------+??
  • |????????????1?|??
  • +--------------+??
  • 1?row?in?set?(0.00?sec)??
  • ??
  • mysql>?set?@@completion_type=1;??
  • Query?OK,?0?rows?affected?(0.00?sec)??
  • ??
  • mysql>?begin;??
  • Query?OK,?0?rows?affected?(0.00?sec)??
  • ??
  • mysql>?insert?into?t?select?1;??
  • Query?OK,?1?row?affected?(0.00?sec)??
  • Records:?1??Duplicates:?0??Warnings:?0??
  • ??
  • mysql>?commit?work;??
  • Query?OK,?0?rows?affected?(0.00?sec)??
  • ??
  • mysql>?insert?into?t?select?2;??
  • Query?OK,?1?row?affected?(0.00?sec)??
  • Records:?1??Duplicates:?0??Warnings:?0??
  • ??
  • mysql>?insert?into?t?select?2;??
  • ERROR?1062?(23000):?Duplicate?entry?'2'?for?key?'PRIMARY'??
  • mysql>?rollback;??
  • Query?OK,?0?rows?affected?(0.00?sec)??
  • ??
  • #?回滾之后只有1這個記錄,而沒有2這個記錄??
  • mysql>?select?*?from?t;??
  • +---+??
  • |?a?|??
  • +---+??
  • |?1?|??
  • +---+??
  • 1?row?in?set?(0.00?sec)??

  • ?

    測試中,將completion_type設置成1,第一次通過commit work來insert這條記錄。之后insert 2的時候并沒有啟用begin(start transaction)來開啟一個事務,之后再插入一條重復的記錄2,這時會拋出異常rollback后,最后發現只有1這樣一條記錄,2并沒有被insert進去。因為completion_type為1的時候,commit work會開啟另外一個事務,因此2個insert語句是在同一個事務里面的,所以回滾后就沒有insert進去。

    參數completion_type為2時,commit work等同于commit and release。當事務提交時候會自動斷開與db的連接,如下:

    [sql]?view plaincopy
  • mysql>?set?@@completion_type=2;??
  • Query?OK,?0?rows?affected?(0.00?sec)??
  • ??
  • mysql>?begin??
  • ????->?;??
  • Query?OK,?0?rows?affected?(0.00?sec)??
  • ??
  • mysql>?insert?into?t?select?3;??
  • Query?OK,?1?row?affected?(0.00?sec)??
  • Records:?1??Duplicates:?0??Warnings:?0??
  • ??
  • mysql>?commit?work;??
  • Query?OK,?0?rows?affected?(0.00?sec)??
  • ??
  • mysql>?select?@@versison;??
  • ERROR?2006?(HY000):?MySQL?server?has?gone?away??
  • No?connection.?Trying?to?reconnect...??
  • Connection?id:????205656??
  • Current?database:?test??
  • ??
  • ERROR?1193?(HY000):?Unknown?system?variable?'versison'??
  • mysql>???
  • ?

    通過上面的測試發現,completion_type設置成2時,commit work之后,再通過select獲取db服務器版本信息的時候出現2006的error,說明以及斷開了與db的連接。

    rollback,rollback work與commit,commit work的工作原理一樣。


    ?rollback(rollback work)
    ?savepoint identifier:在事務中創建一個保存點,一個事務允許有多個保存點
    ?release savepoint identifier:刪除事務中的保存點,當時一個保存點也沒有時執行這個命令,會報錯拋出一個異常,如下所示:

    [sql]?view plaincopy
  • mysql>?begin;??
  • Query?OK,?0?rows?affected?(0.00?sec)??
  • ??
  • mysql>?rollback?to?savepoint?t1;??
  • ERROR?1305?(42000):?SAVEPOINT?t1?does?not?exist??
  • mysql>???

  • innodb存儲引擎中的事務都是原子性的,說明以下2種情況:
    構成事務的每條語句都會commit,否則事務的每條語句都會rollback,這種保護還會涉及到單調的語句。一條語句要不完成成功要么完全回滾,
    但是一條語句失敗并不會導致前一條執行的語句自動回滾,他們的工作會保留,需要你手動commit或者rollback。如下

    [sql]?view plaincopy
  • mysql>??create?table?t(a?int,?primary?key?(a))engine=innodb;??
  • Query?OK,?0?rows?affected?(0.24?sec)??
  • ??
  • mysql>?begin??
  • ????->?;??
  • Query?OK,?0?rows?affected?(0.00?sec)??
  • ??
  • mysql>?insert?into?t?select?1;??
  • Query?OK,?1?row?affected?(0.00?sec)??
  • Records:?1??Duplicates:?0??Warnings:?0??
  • ??
  • mysql>?insert?into?t?select?1;??
  • ERROR?1062?(23000):?Duplicate?entry?'1'?for?key?'PRIMARY'??
  • mysql>?select?*?from?t;??
  • +---+??
  • |?a?|??
  • +---+??
  • |?1?|??
  • +---+??
  • 1?row?in?set?(0.00?sec)??
  • ??
  • mysql>???
  • 可以看到,插入第二條記錄的時候,db拋出了1062錯誤,但是并沒有自動回滾,能查出前一條insert的記錄,這個時候需要我們手動commit或者rollback??

  • ?

    ?rollback to [savepoint] identifier:與savepoint一起使用,可以把事務回滾到標記點,而不回滾在此標記點之前的任何工作。
    ?
    ?set transaction:設置事務的隔離級別,4種事務隔離級別:read uncommitted,read committed,repeatable read,serializable。
    ?start transaction與begin都可以在mysql命令行下顯示的開啟一個事務,但是在存儲過程中MySQL會自動將begin識別成begin ... end。
    ?因此在存儲過程中,只能用start transaction。

    總結

    以上是生活随笔為你收集整理的MySQL事务控制语句的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。