最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解MySQL中的事務(wù)機(jī)制

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

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

在一個(gè)web應(yīng)用中,會(huì)很經(jīng)常遇到需要使用事務(wù)的地方,要么希望若干語句都執(zhí)行成功,要么都不執(zhí)行,如果出現(xiàn)有些執(zhí)行成功,而其他的失敗將會(huì)導(dǎo)致數(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)

    設(shè)想你需要一個(gè)新的叫做Grace Williams雇員,并帶有他的電話號(hào)碼信息。你可能會(huì)執(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');

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

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

<?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);
 
?>


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

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

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

相關(guān)文章

  • 淺談MySQL8.0 異步復(fù)制的三種方式

    淺談MySQL8.0 異步復(fù)制的三種方式

    這篇文章主要介紹了淺談MySQL8.0 異步復(fù)制的三種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 詳解在MySQL中創(chuàng)建表的教程

    詳解在MySQL中創(chuàng)建表的教程

    這篇文章主要介紹了詳解在MySQL中創(chuàng)建表的教程,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • MySQL存儲(chǔ)過程的創(chuàng)建、調(diào)用與管理詳解

    MySQL存儲(chǔ)過程的創(chuàng)建、調(diào)用與管理詳解

    這篇文章主要給大家介紹了關(guān)于MySQL存儲(chǔ)過程的創(chuàng)建、調(diào)用與管理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • mysql查看鎖表及殺進(jìn)程問題

    mysql查看鎖表及殺進(jìn)程問題

    這篇文章主要介紹了mysql查看鎖表及殺進(jìn)程問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • MySQL進(jìn)行查詢結(jié)果求和的五種方法詳解

    MySQL進(jìn)行查詢結(jié)果求和的五種方法詳解

    在數(shù)據(jù)庫中,求和查詢是一種常見的操作,特別是在處理大量數(shù)據(jù)時(shí),MySQL?提供了多種方法來執(zhí)行求和操作,下面小編就和大家詳細(xì)介紹一下吧
    2025-12-12
  • CentOS6.8使用cmake安裝MySQL5.7.18

    CentOS6.8使用cmake安裝MySQL5.7.18

    這篇文章主要為大家詳細(xì)介紹了CentOS6.8使用cmake安裝MySQL5.7.18的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 圖文并茂地講解Mysql索引(index)

    圖文并茂地講解Mysql索引(index)

    在關(guān)系數(shù)據(jù)庫中,索引是一種單獨(dú)的、物理的數(shù)對(duì)數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種存儲(chǔ)結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于Mysql索引(index)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • MySQL 8.0 新特性之哈希連接(Hash Join)

    MySQL 8.0 新特性之哈希連接(Hash Join)

    MySQL 開發(fā)組于 2019 年 10 月 14 日 正式發(fā)布了 MySQL 8.0.18 GA 版本,帶來了一些新特性和增強(qiáng)功能。這篇文章主要介紹了MySQL 8.0 新特性之哈希連接(Hash Join),需要的朋友可以參考下
    2019-10-10
  • Mysql CONVERT函數(shù)的具體使用

    Mysql CONVERT函數(shù)的具體使用

    本文主要介紹了Mysql CONVERT函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • MySQL 重寫查詢語句的三種策略

    MySQL 重寫查詢語句的三種策略

    這篇文章主要介紹了MySQL 重寫查詢語句的三種策略,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-05-05

最新評(píng)論

清涧县| 清新县| 大冶市| 诸城市| 阿合奇县| 庄浪县| 宁安市| 甘南县| 获嘉县| 津市市| 九龙县| 宜阳县| 丽水市| 张家界市| 新竹县| 镇江市| 英超| 额尔古纳市| 巴楚县| 南郑县| 清远市| 稷山县| 从江县| 建始县| 福建省| 乌鲁木齐县| 韩城市| 珠海市| 丰宁| 岳阳县| 阿瓦提县| 来安县| 津市市| 延安市| 玉林市| 高邮市| 无棣县| 天柱县| 泸水县| 舒城县| 增城市|