代碼詳細(xì)說(shuō)明MySQL中對(duì)于事務(wù)的處理
發(fā)表時(shí)間:2023-07-14 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]這篇文章主要介紹了詳解MySQL中關(guān)于事務(wù)的處理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧步驟:1.開啟事務(wù) start transaction當(dāng)我們開啟一個(gè)事務(wù)的...
這篇文章主要介紹了詳解MySQL中關(guān)于事務(wù)的處理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
步驟:
1.開啟事務(wù) start transaction
當(dāng)我們開啟一個(gè)事務(wù)的時(shí)候,我們對(duì)sql的操作都發(fā)生在內(nèi)存中,但是沒(méi)有真正的反饋到數(shù)據(jù)庫(kù)磁盤的文件中!
2.回滾 rollback
回滾,就是恢復(fù)到事務(wù)開啟之前的最原始的狀態(tài)!
注意:回滾操作會(huì)自動(dòng)的關(guān)閉一個(gè)事務(wù),如果想再次執(zhí)行事務(wù),需要重新開啟事務(wù)!
3.提交 commit
事務(wù)的基本原理
普通的執(zhí)行,之所以是立即執(zhí)行并生效,因?yàn)槟J(rèn)的,MySQL對(duì)sql語(yǔ)句的執(zhí)行是自動(dòng)提交的!所以,開啟一個(gè)事務(wù)的本質(zhì),就是關(guān)閉了以前的自動(dòng)提交的功能,而是由用戶手動(dòng)提交(利用commit語(yǔ)句)!
總結(jié)事務(wù)的步驟:
1, 開啟事務(wù)
2, 如果執(zhí)行成功,就提交commit
3, 如果有任何一條sql語(yǔ)句執(zhí)行失敗,則回滾rollback!
事務(wù)處理最典型的就是借還錢。下面以張三向李四還1000元為例
首先查看數(shù)據(jù)庫(kù)中各自的錢數(shù)
下面是處理還錢事務(wù)的代碼:
<?php
/**
* MySQL實(shí)現(xiàn)事務(wù)操作
*/
echo "<meta charset=utf-8>";
// 1 連接數(shù)據(jù)庫(kù)
$link = @mysql_connect('localhost','root','') or die('連接數(shù)據(jù)庫(kù)失敗');
mysql_select_db('test',$link);mysql_query('set names utf8');
// 2 開啟事務(wù)
mysql_query("start transaction");
//設(shè)置一個(gè)變量,用來(lái)判斷所有sql語(yǔ)句是否成功
$flag = true;
// 2.1執(zhí)行事務(wù)中的一組sql語(yǔ)句
// 李四的money+1000
$sql = "update pdo set mone=money+1000 where name='李四'";
$res = mysql_query($sql);
if (!$res) {
//若sql語(yǔ)句執(zhí)行失敗,把$falg設(shè)置為false
$flag = false;
}
//張三的money-1000
$sql = "update pdo set money=money-1000 where name='張三'";
$res = mysql_query($sql);
if (!$res) {
//若sql語(yǔ)句執(zhí)行失敗,把$falg設(shè)置為false
$flag = false;
}
// 2.2 判斷事務(wù)是否執(zhí)行成功
if ($flag) {
//所有sql語(yǔ)句執(zhí)行成功,把sql語(yǔ)句提交
mysql_query('commit'); echo "還錢成功!";
}else{
// 如其中一條執(zhí)行失敗,則回滾到事務(wù)開啟之前的狀態(tài)
mysql_query('rollback'); echo "還錢失!";
}
結(jié)果:
下面,我們故意把其中一個(gè)字段寫錯(cuò),看看事務(wù)是否正常處理,數(shù)據(jù)庫(kù)中的錢數(shù)是否有變化!
// 李四的money+1000
$sql = "update pdo set mone=money+1000 where name='李四'"; //把moeny字段錯(cuò)寫成mone
結(jié)果:
結(jié)果是還錢失敗,并且數(shù)據(jù)庫(kù)中各自的錢數(shù)沒(méi)有變化,說(shuō)明當(dāng)某一條語(yǔ)句未執(zhí)行成功時(shí),事物不會(huì)提交,而會(huì)回滾,把數(shù)據(jù)恢復(fù)到開始事務(wù)之前的原始狀態(tài),這也是使用事務(wù)的作用,即只有當(dāng)事務(wù)中所有sql語(yǔ)句全部執(zhí)行成功,事務(wù)才會(huì)提交,否則會(huì)回滾!
以上就是代碼詳解MySQL中關(guān)于事務(wù)的處理的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
學(xué)習(xí)教程快速掌握從入門到精通的SQL知識(shí)。