欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解MySQL中的事務機制

 更新時間:2015年06月26日 10:23:50   投稿:goldensun  
這篇文章主要介紹了MySQL中的事務機制,事務機制在各大MySQL教程中均為重要知識,需要的朋友可以參考下

 使用數(shù)據(jù)庫事務可以確保除事務性單元內的所有操作都成功完成。MySQL中的InnoDB引擎的表才支持transaction。在一個事務里,如果出現(xiàn)一個數(shù)據(jù)庫操作失敗了,事務內的所有操作將被回滾,數(shù)據(jù)庫將會回到事務前的初始狀態(tài)。有一些不能被回滾的語句:將在本文的最后討論。

在一個web應用中,會很經(jīng)常遇到需要使用事務的地方,要么希望若干語句都執(zhí)行成功,要么都不執(zhí)行,如果出現(xiàn)有些執(zhí)行成功,而其他的失敗將會導致數(shù)據(jù)損壞。

在這篇文章的例子中,我們使用下面的兩張表"employee"和"telephone",下面是SQL語句(作為參考):

創(chuàng)建 employee表:
 

CREATE TABLE `employee` (
 `id` int NOT NULL AUTO_INCREMENT,
 `first_name` varchar(100) NOT NULL,
 `last_name` varchar(100) NOT NULL,
 `job_title` varchar(100) DEFAULT NULL,
 `salary` double DEFAULT NULL,
 `notes` text,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

向employee中插入數(shù)據(jù)
 

INSERT INTO `employee` (`first_name`, `last_name`, `job_title`, `salary`) VALUES
            ('Robin', 'Jackman', 'Software Engineer', 5500),
            ('Taylor', 'Edward', 'Software Architect', 7200),
            ('Vivian', 'Dickens', 'Database Administrator', 6000),
            ('Harry', 'Clifford', 'Database Administrator', 6800),
            ('Eliza', 'Clifford', 'Software Engineer', 4750),
            ('Nancy', 'Newman', 'Software Engineer', 5100),
            ('Melinda', 'Clifford', 'Project Manager', 8500),
            ('Harley', 'Gilbert', 'Software Architect', 8000);

創(chuàng)建telephone表
 

CREATE TABLE `telephone` (
 `id` int NOT NULL AUTO_INCREMENT,
 `employee_id` int DEFAULT NULL,
 `type` varchar(20) NOT NULL,
 `no` varchar(50) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

向telephone表插入數(shù)據(jù)
 

INSERT INTO `telephone` (`employee_id`, `type`, `no`) VALUES
            (1, 'mobile',  '245-249697'),
            (2, 'mobile',  '270-235969'),
            (2, 'land',   '325-888885'),
            (3, 'mobile',  '270-684972'),
            (4, 'mobile',  '245-782365'),           
            (4, 'land',   '325-888886'),
            (5, 'mobile',  '245-537891'),
            (6, 'mobile',  '270-359457'),
            (7, 'mobile',  '245-436589'),                           
            (7, 'land',   '325-888887'),
            (8, 'mobile',  '245-279164'),                           
            (8, 'land',   '325-888888');

2015626102143340.jpg (447×584)

    設想你需要一個新的叫做Grace Williams雇員,并帶有他的電話號碼信息。你可能會執(zhí)行下面兩句sql: 
 

INSERT INTO `employee` (`id`, `first_name`, `last_name`,
`job_title`, `salary`) VALUES (9, 'Grace', 'Williams',
'Softwaree Engineer', 5000);
 
INSERT INTO `telephone` (`id`, `employee_id`, `type`,
`no`) VALUES (13, 9, 'mobile', '270-598712');

讓我們看看第二個語句,在第一個語句中,employee_id是在第一條語句中指定的,設想一下,當?shù)谝粭l語句失敗,而第二條語句成功的狀況。在這種狀況下,telephone表中就會有一條employee_id為9的記錄,而employee表中并沒有id為9的記錄,而如果將這兩個語句放在MySQL事務中,如果第一條語句失敗,那么第二條語句也將回滾,從而不會造成這種問題。

在PHP(PHP參考文檔)中我們可以使用如下的方式啟用事務:
 

<?php
 
//$salary = 5000;
$salary = '$5000';
 
/* Change database details according to your database */
$dbConnection = mysqli_connect('localhost', 'robin', 'robin123', 'company_db');
 
mysqli_autocommit($dbConnection, false);
 
$flag = true;
 
$query1 = "INSERT INTO `employee` (`id`, `first_name`, `last_name`, `job_title`, `salary`) VALUES (9, 'Grace', 'Williams', 'Softwaree Engineer', $salary)";
$query2 = "INSERT INTO `telephone` (`id`, `employee_id`, `type`, `no`) VALUES (13, 9, 'mobile', '270-598712')";
 
$result = mysqli_query($dbConnection, $query1);
 
if (!$result) {
  $flag = false;
  echo "Error details: " . mysqli_error($dbConnection) . ". ";
}
 
$result = mysqli_query($dbConnection, $query2);
 
if (!$result) {
  $flag = false;
  echo "Error details: " . mysqli_error($dbConnection) . ". ";
}
 
if ($flag) {
 
  mysqli_commit($dbConnection);
  echo "All queries were executed successfully";
 
} else {
 
  mysqli_rollback($dbConnection);
  echo "All queries were rolled back"; 
 
}
 
mysqli_close($dbConnection);
 
?>


    當你執(zhí)行mysqli_query函數(shù)的時候,結果被立即提交到了數(shù)據(jù)庫。使用mysqli_autocommit函數(shù),可以關閉自動提交,執(zhí)行結果只有當你想提交的時候才提交。
    如果任何語句執(zhí)行失敗我們都可以設置$flag變量為false。如果有很多語句要執(zhí)行,可以考慮將他們放在for循環(huán)中。
    最后,如果flag是true(也就是沒有錯誤發(fā)生),我們使用mysqli_commit提交事務。否則我們使用mysqli_rollback回滾事務。

所以,事務可以在某種程度上幫助我們維護數(shù)據(jù)的完整和正確,另外,為了保證數(shù)據(jù)無誤,我們還推薦使用外鍵。

并不是所有的語句都是支持事務的,例如,如果使用CREATE TABLE或者ALTER TABLE語句,需要了解更多可以參考MySQL手冊查看哪些語句不能回滾。

相關文章

  • 為什么MySQL數(shù)據(jù)庫索引選擇使用B+樹?

    為什么MySQL數(shù)據(jù)庫索引選擇使用B+樹?

    今天小編就為大家分享一篇關于為什么MySQL數(shù)據(jù)庫索引選擇使用B+樹?,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • MySQL自動安裝腳本代碼實例分享

    MySQL自動安裝腳本代碼實例分享

    這篇文章主要介紹了MySQL自動安裝腳本代碼實例分享的相關資料,需要的朋友可以參考下
    2023-07-07
  • CentOS 6.2 安裝 MySQL 5.7.28的教程(mysql 筆記)

    CentOS 6.2 安裝 MySQL 5.7.28的教程(mysql 筆記)

    本文通過圖文并茂的形式給大家介紹了CentOS 6.2 安裝 MySQL 5.7.28的教程,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2019-11-11
  • Mysql表連接的執(zhí)行流程詳解

    Mysql表連接的執(zhí)行流程詳解

    這篇文章主要介紹了Mysql表連接的執(zhí)行流程詳解,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-08-08
  • MySQL自動為查詢數(shù)據(jù)結果加序號

    MySQL自動為查詢數(shù)據(jù)結果加序號

    這篇文章主要給大家介紹了關于MYSQL如何自動為查詢數(shù)據(jù)的結果編上序號的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用mysql具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧
    2022-12-12
  • MySQL?臨時表的原理以及優(yōu)化方法

    MySQL?臨時表的原理以及優(yōu)化方法

    這篇文章主要介紹了MySQL?臨時表的原理以及優(yōu)化方法,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 計算機管理服務中找不到mysql的服務的解決辦法

    計算機管理服務中找不到mysql的服務的解決辦法

    MySQL是一種流行的開源關系型數(shù)據(jù)庫管理系統(tǒng),用于存儲和管理大量數(shù)據(jù),在計算機管理中,啟動MySQL服務是一項重要的任務,因為它可以確保數(shù)據(jù)庫系統(tǒng)的順利運行,這篇文章主要給大家介紹了關于計算機管理服務中找不到mysql的服務的解決辦法,需要的朋友可以參考下
    2023-05-05
  • 兩種mysql對自增id重新從1排序的方法

    兩種mysql對自增id重新從1排序的方法

    本文介紹了兩種mysql對自增id重新從1排序的方法,簡少了對于某個項目初始化數(shù)據(jù)的工作量,感興趣的朋友可以參考下
    2015-07-07
  • 老鳥帶你開發(fā)專業(yè)規(guī)范的MySQL啟動腳本

    老鳥帶你開發(fā)專業(yè)規(guī)范的MySQL啟動腳本

    這篇文章主要介紹了老鳥帶你開發(fā)專業(yè)規(guī)范的MySQL啟動腳本,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • mysql備份恢復mysqldump.exe幾個常用用例

    mysql備份恢復mysqldump.exe幾個常用用例

    收集了,一個整理不錯的,mysql備份與恢復用法
    2008-08-08

最新評論