這篇文章主要介紹了詳解mysql中關于事務的處理,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
步驟:
1.開啟事務?start transaction
當我們開啟一個事務的時候,我們對sql的操作都發生在內存中,但是沒有真正的反饋到數據庫磁盤的文件中!
2.回滾?rollback
回滾,就是恢復到事務開啟之前的最原始的狀態!
注意:回滾操作會自動的關閉一個事務,如果想再次執行事務,需要重新開啟事務!
3.提交?commit
?
事務的基本原理
?
普通的執行,之所以是立即執行并生效,因為默認的,MySQL對sql語句的執行是自動提交的!所以,開啟一個事務的本質,就是關閉了以前的自動提交的功能,而是由用戶手動提交(利用commit語句)!
總結事務的步驟:
1,? 開啟事務
2,? 如果執行成功,就提交commit
3,? 如果有任何一條sql語句執行失敗,則回滾rollback!
?
事務處理最典型的就是借還錢。下面以張三向李四還1000元為例
首先查看數據庫中各自的錢數
下面是處理還錢事務的代碼:
<span style="font-size: 14px; font-family: 微軟雅黑, " microsoft yahei><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>php </span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>/** * MySQL實現事務操作<br>*/<br><br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>echo</span> "<meta charset="utf-8">"<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>;<br><br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>// 1 連接數據庫<br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>$link</span> = @<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>mysql_connect</span>('localhost','root','') or <span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>die</span>('連接數據庫失敗'<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>);<br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>mysql_select_db</span>('test',<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>$link</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>);</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>mysql_query</span>('set names utf8'<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>);<br><br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>// 2 ?開啟事務<br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>mysql_query</span>("start transaction"<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>);<br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>//設置一個變量,用來判斷所有sql語句是否成功<br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>$flag</span> = <span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>true</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>;<br><br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>// 2.1執行事務中的一組sql語句 <br><br>// 李四的money+1000<br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>$sql</span> = "update pdo set mone=money+1000 where name='李四'"<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>;<br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>$res</span> = <span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>mysql_query</span>(<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>$sql</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>);<br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>if</span> (!<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>$res</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>) { ? <br> ? ??</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>//若sql語句執行失敗,把$falg設置為false</span> ? ?<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>$flag</span> = <span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>false</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>; }<br><br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>//張三的money-1000<br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>$sql</span> = "update pdo set money=money-1000 where name='張三'"<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>;<br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>$res</span> = <span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>mysql_query</span>(<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>$sql</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>);<br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>if</span> (!<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>$res</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>) { ?<br> ? ??</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>//若sql語句執行失敗,把$falg設置為false</span> ? ?<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>$flag</span> = <span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>false</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>; }<br><br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>// 2.2 判斷事務是否執行成功<br></span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>if</span> (<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>$flag</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>) { ? <br> ? ??</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>//所有sql語句執行成功,把sql語句提交</span> ? ?<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>mysql_query</span>('commit'<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>); ? ?</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>echo</span> "還錢成功!"<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>; }</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>else</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>{ ?<br> ? ??</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>// 如其中一條執行失敗,則回滾到事務開啟之前的狀態</span> ? ?<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>mysql_query</span>('rollback'<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>); ? ?</span><span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height: color: rgb>echo</span> "還錢失敗!"<span style="font-family: 微軟雅黑, " microsoft yahei font-size: margin: padding: line-height:>; }</span></span>
結果:
下面,我們故意把其中一個字段寫錯,看看事務是否正常處理,數據庫中的錢數是否有變化!
<span style="font-size: 14px; font-family: 微軟雅黑, " microsoft yahei>// 李四的money+1000<br>$sql = "update pdo set mone=money+1000 where name='李四'"; ?//把moeny字段錯寫成mone<br></span>
結果:
結果是還錢失敗,并且數據庫中各自的錢數沒有變化,說明當某一條語句未執行成功時,事物不會提交,而會回滾,把數據恢復到開始事務之前的原始狀態,這也是使用事務的作用,即只有當事務中所有sql語句全部執行成功,事務才會提交,否則會回滾!
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END