成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

用新PHP插件實現MySQL為基礎的事務

瀏覽:212日期:2024-02-10 17:03:54

事務處理支持很長時間以來一直是大多數MySQL開發者的心愿,隨著MySQL 4.0的發布,這個心愿最后終于得以實現。MySQL 4.0后不久,擁有一個新的MySQL插件的PHP 5.x也發布了。這個新插件,MySQL Improved,使得PHP開發者通過利用本地的PHP函數,獲得了這些新的事務處理能力。這篇簡短的教程將向你說明怎樣利用這些新的MySQLi函數,用PHP實現以MySQL為基礎的事務。

概要

如果你還不知道,那么我可以告訴你,事務只是一組SQL語句,通常因為它們是彼此相互依賴的,所以要在全有或全無(all-or-nothing)的模式下執行。只有當所有組成的語句都執行成功了,一個事務才算是成功了;任何一個語句中的失敗應該都會導致系統“回滾”到它先前的狀態,以避免數據連接/崩潰問題。

對于這一點,兩個銀行帳戶間的轉帳是一個很好的例子。在數據庫級,這樣的轉帳包括兩個步驟:首先,從源帳戶中扣除轉帳的金額,然后將其加到目標帳戶中。如果在第二步中發生了錯誤,那么第一步就必須被取消,以避免不相符的情況(和憤怒的客戶聚眾滋事)。事務安全系統將自動地撤到系統先前的“快照”。

大多數數據庫(包括MySQL)通過一個命令的組合來完成這個:

* START TRANSACTION命令標志著一個新的事務組的開始。它后面常接一系列的SQL命令。

* COMMIT命令標志著一個事務組的結束,表示事務期間做的所有改變應該被提交或者使之永久化。

* ROLLBACK命令標志著一個事務組的結束,表示事務期間所做的所有改變應該被撤消。

PHP中的事務處理函數

PHP中的MySQLi插件引進了新的函數,幫助開發者利用MySQL的事務處理能力。實質上,這些函數對等地被叫做SQL START TRANSACTION,COMMIT和 ROLLBACK命令。列表A為你展示了一個例子,列表A:

// connect to database

$dbh = mysqli_connect($host, $user, $pass, $db);

// turn off auto-commit

mysqli_autocommit($dbh, FALSE);

// run query 1

$result = mysqli_query($dbh, $query1);

if ($result !== TRUE) {

mysqli_rollback($dbh); // if error, roll back transaction

}

// run query 2

$result = mysqli_query($dbh, $query2);

if ($result !== TRUE) {

mysqli_rollback($dbh); // if error, roll back transaction

}

// and so on...

// assuming no errors, commit transaction

mysqli_commit($dbh);

// close connection

mysqli_close($dbh);

?>

在PHP 中執行一項事務有三個基本的步驟:

* 第一步是始終關掉數據庫的“auto-commit”,它實質上意味著系統在你作出改變時就保存它們。這一點是很重要的,因為在一個事務處理環境中,你應該只有在確定了所有事務處理的“unit”都成功完成了以后,才保存你所做的改變。你可以通過mysqli_autocommit()函數關掉數據庫的自動提交。

* 接下來,通過mysqli_query()函數,繼續用通常的方法進行INSERT、UPDATE和/或DELETE查詢。檢驗每一個查詢返回的值,弄清楚它是否成功了是很重要的。如果其中任何一個查詢失敗了,mysqli_rollback()函數就會被用來將系統返回到事務進行之前的狀態。

* 假設組成事務組的所有命令都成功執行了,就要用mysqli_commit()函數將變化保存到數據庫系統。請注意,一旦這個函數被調用,事務就不能被撤消了。

工作實例

要了解這個在實踐中是怎么工作的,讓我們回到前面討論過的銀行轉帳的例子.我們假設你的任務是建立一個簡單的Web應用程序,讓用戶在他們的銀行帳戶間轉帳。我們再進一步假設一個單獨用戶的帳戶存儲在一個MySQL數據庫中,如下所示:

mysql> SELECT * FROM accounts;

+----+------------+---------+

| id | label | balance |

+----+------------+---------+

| 1 | Savings #1 | 1000 |

| 2 | Current #1 | 2000 |

| 3 | Current #2 | 3000 |

+----+------------+---------+

3 rows in set (0.34 sec)

現在,需要建立一個簡單的界面,使用戶能夠輸入一個現金數額,實現從一個帳戶到另一個的轉帳。實際的“交易”將用兩個UPDATE語句來執行,一個將轉帳金額從源帳戶取出,即借方,另一個將轉帳金額記入目標帳戶,即貸方。假設我們所做的是在帳戶之間進行轉帳,那么所有帳戶的可用結余總額($6000)應該一直保持不變。

列表B顯示了可能的代碼,列表 B:

// connect to database

$dbh = mysqli_connect('localhost', 'user', 'pass', 'test') or die('Cannot connect');

// turn off auto-commit

mysqli_autocommit($dbh, FALSE);

// look for a transfer

if ($_POST['submit'] && is_numeric($_POST['amt'])) {

// add $$ to target account

$result = mysqli_query($dbh, 'UPDATE accounts SET balance = balance + ' . $_POST['amt'] . ' WHERE id = ' . $_POST['to']);

if ($result !== TRUE) {

mysqli_rollback($dbh); // if error, roll back transaction

}

// subtract $$ from source account

$result = mysqli_query($dbh, 'UPDATE accounts SET balance = balance - ' . $_POST['amt'] . ' WHERE id = ' . $_POST['from']);

if ($result !== TRUE) {

mysqli_rollback($dbh); // if error, roll back transaction

}

// assuming no errors, commit transaction

mysqli_commit($dbh);

}

// get account balances

// save in array, use to generate form

$result = mysqli_query($dbh, 'SELECT * FROM accounts');

while ($row = mysqli_fetch_assoc($result)) {

$accounts[] = $row;

}

// close connection

mysqli_close($dbh);

?>像你所看到的那樣,腳本以連接數據庫和關閉自動提交開始。然后執行一個SELECT查詢,檢索所有帳戶的現金收支,接著構造一個有下拉式界面的表格,選擇交易要用到的來源/目標帳戶。圖表A顯示了最初的表格。

最初的表格

一旦表格完成并提交后,兩個UPDATE查詢就開始實際執行借和貸操作。注意每一個查詢的尾端都帶有一個mysqli_rollback(),如果查詢失敗的話,它將被激活。假設沒有查詢失敗的話,新的收支表就通過調用mysqli_commit()儲存到數據庫中。那時數據庫連接就被關閉。

你可以自己試一下,從Savings #1轉$500到Current #2。一旦你執行轉帳之后,你將看到如圖表B所示的平衡表的新結果。

交易完成之后的狀況。

提示:當然,這只是一個簡單的雙命令的事務。通常,當有許多SQL語句要一起執行的時候,你可以用這種事務模型,一個語句的失敗對其他語句有串聯的影響。在這些情況下,你會發現將mysqli_query()和mysqli_rollback()的調用壓縮到一個單獨的用戶自定義的函數中,需要的時候調用它會更加簡便。

正如你所看到的那樣,用PHP和MySQL執行一個事務處理模型可以使你的MySQL數據庫對查詢執行的錯誤更穩固。但是,在你開始動手重寫代碼和使用這個模型之前,值得注意的是,事務確實會增加系統性能管理的消耗,所以,在實現這個模型之前,做一個成本效益分析始終是個好主意。

標簽: PHP
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
大尺度一区二区| 国产一区二区无遮挡| 高清shemale亚洲人妖| 亚洲一区二区伦理| 亚洲丝袜精品丝袜在线| 你懂的网址国产 欧美| 日韩一二三区视频| 国产综合色在线视频区| 欧美日韩亚洲另类| 卡一卡二国产精品 | 欧美成人有码| 国产亚洲欧美色| 欧美不卡高清| 久久人人爽人人爽| 欧美一区二区三区在线免费观看| 日韩精品一区二区三区四区视频| 国产一区二区三区观看| 欧美顶级少妇做爰| 国产精品一区免费视频| 欧美福利视频一区| 国产乱码精品一区二区三区五月婷| 欧美色男人天堂| 国内成人免费视频| 欧美一级片在线| www.视频一区| 欧美国产综合色视频| 欧美日韩一区二区三区在线视频 | 亚洲影院在线| 亚洲综合一区在线| 亚洲女人av| 亚洲成人1区2区| 一本大道综合伊人精品热热| 蜜桃av一区二区| 在线不卡中文字幕播放| 国产成人超碰人人澡人人澡| 精品久久久久久亚洲综合网| 午夜精品美女久久久久av福利| 国产精品妹子av| 亚洲黄色成人| 亚洲一区二区三区三| 久久免费高清| 久久se这里有精品| 91精品国产乱码| 99久久精品国产网站| 欧美国产国产综合| 伊甸园精品99久久久久久| 亚洲精品第1页| 色婷婷亚洲一区二区三区| 精品写真视频在线观看| 日韩小视频在线观看专区| 91视频精品在这里| 中文字幕日韩av资源站| 免费视频一区| 久久66热re国产| 精品久久久久久综合日本欧美 | 日本午夜一本久久久综合| 欧美日韩一区高清| 成人黄色av电影| 中文字幕一区二区三中文字幕| 亚洲一区在线直播| 国产在线精品视频| 国产日韩欧美激情| 国产日韩欧美一区二区三区在线观看 | 久久精品人人做人人爽人人| 亚洲欧洲一级| 秋霞电影一区二区| 精品成人免费观看| 国产日产精品一区二区三区四区的观看方式 | 黄色av日韩| 天天色天天爱天天射综合| 制服丝袜亚洲精品中文字幕| 99久久精品国产麻豆演员表| 亚洲欧美国产毛片在线| 91福利国产成人精品照片| 成人免费视频一区| 一区二区三区影院| 欧美精品一卡二卡| 国产精品v欧美精品v日韩 | 亚洲自拍偷拍九九九| 欧美日韩1234| 欧美激情麻豆| 日韩高清在线不卡| 精品噜噜噜噜久久久久久久久试看| 亚洲国产三级| 国产一区日韩二区欧美三区| 国产精品国产三级国产aⅴ中文| 一本色道久久综合亚洲精品按摩| 成人av网站在线观看免费| 亚洲一区二区成人在线观看| 日韩午夜三级在线| 国产亚洲精品v| 国产成a人亚洲精品| 亚洲视频免费看| 欧美高清视频一二三区| 亚洲黄色视屏| 国产成人在线视频免费播放| 亚洲视频在线一区二区| 欧美日韩亚洲综合一区二区三区| 欧美精品系列| 激情深爱一区二区| 亚洲精品自拍动漫在线| 欧美一卡2卡3卡4卡| 亚洲永久字幕| 欧美精品v日韩精品v国产精品| 蜜桃视频在线观看一区| 国产精品麻豆久久久| 在线成人av影院| 亚洲欧洲日本国产| 国产成人高清视频| 婷婷成人激情在线网| 国产欧美日韩麻豆91| 在线免费视频一区二区| 国内精品久久久久国产盗摄免费观看完整版 | 欧美精品自拍偷拍动漫精品| 亚洲三级电影在线观看| 国产精品99久久久久久有的能看| 一区二区三区鲁丝不卡| 久久老女人爱爱| 欧日韩精品视频| 1000部精品久久久久久久久| 国产福利91精品一区| 亚洲第一精品在线| 中日韩av电影| 欧美一级日韩不卡播放免费| 亚洲女人av| 欧美激情1区2区3区| 精品一区二区三区的国产在线播放| 亚洲人成伊人成综合网小说| 精品国产乱码久久久久久蜜臀| 欧美三级电影网| 亚洲在线不卡| 亚洲午夜av| 欧美激情第六页| eeuss鲁片一区二区三区在线看 | 色综合久久中文字幕| 狠狠色丁香婷综合久久| 亚洲一线二线三线久久久| 久久视频一区二区| 欧美美女喷水视频| 午夜一级在线看亚洲| 狠狠入ady亚洲精品| 成a人片国产精品| 久久99精品久久久| 午夜成人免费视频| 亚洲视频一二区| 国产欧美日韩激情| 精品久久五月天| 欧美丰满少妇xxxxx高潮对白| 葵司免费一区二区三区四区五区| 精品二区久久| 91蜜桃在线免费视频| 国产成人精品综合在线观看 | 国产精品免费视频一区| 精品免费视频一区二区| 欧美电影影音先锋| 91搞黄在线观看| 毛片一区二区| 在线视频精品一区| 亚洲理论在线| 在线日韩电影| 亚洲成人直播| 永久久久久久| 欧美日韩影院| 欧美日韩一区二区三区在线视频| 色综合天天综合网天天看片| 99久久精品免费| 不卡视频一二三| 成人激情av网| 成人av中文字幕| 成人av电影在线网| 成人免费观看视频| 国产激情视频一区二区三区欧美 | 亚洲国产免费看| 国内精品久久国产| 狠狠色噜噜狠狠色综合久| 欧美福利一区| 色综合咪咪久久| 国产精品videosex极品| 亚洲午夜极品| 亚洲精品黄色| 国产精品日韩欧美一区二区| 在线视频精品| 午夜在线视频观看日韩17c| 亚洲在线播放| 在线免费观看不卡av| 日本福利一区二区| 欧美三级电影一区| 欧美一级黄色大片| 精品国一区二区三区| 久久久www成人免费无遮挡大片| 精品成人一区二区| 国产婷婷精品av在线| 国产精品伦理一区二区| 国产精品久久国产精麻豆99网站| 不卡欧美aaaaa| 91蜜桃免费观看视频| 国内精品久久久久久久影视麻豆| 亚洲日本激情| 久久精品女人| 欧美日韩黄色一区二区|