MySQL事務(wù)處理與應(yīng)用簡析
事務(wù)處理在各種管理系統(tǒng)中都有著廣泛的應(yīng)用,比如人員管理系統(tǒng),很多同步數(shù)據(jù)庫操作大都需要用到事務(wù)處理。比如說,在人員管理系統(tǒng)中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關(guān)的信息,如信箱,文章等等,這樣,這些數(shù)據(jù)庫操作語句就構(gòu)成一個事務(wù)!
刪除的SQL語句
delete from userinfo where ~~~
delete from mail where ~~
delete from article where~~
~~
如果沒有事務(wù)處理,在你刪除的過程中,假設(shè)出錯了,只執(zhí)行了第一句,那么其后果是難以想象的!
但用事務(wù)處理。如果刪除出錯,你只要rollback就可以取消刪除操作(其實是只要你沒有commit你就沒有確實的執(zhí)行該刪除操作)
一般來說,在商務(wù)級的應(yīng)用中,都必須考慮事務(wù)處理的!
查看inodb信息
shell> /usr/local/mysql -u root -p
mysql> show variables like "have_%"
系統(tǒng)會提示:
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_bdb | YES |
| have_crypt | YES |
| have_innodb| YES |
| have_isam | YES |
| have_raid | YES |
| have_symlink | YES |
| have_openssl | NO |
| have_query_cache | YES |
+------------------+-------+
8 rows in set (0.05 sec)
如果是這樣的,那么我們就可以創(chuàng)建一張支持事務(wù)處理的表來試試了。
MYSQL的事務(wù)處理功能!
一直以來我都以為MYSQL不支持事務(wù)處理,所以在處理多個數(shù)據(jù)表的數(shù)據(jù)時,一直都很麻煩(我是不得不將其寫入文本文件,在系統(tǒng)重新加載得時候才寫入數(shù)據(jù)庫以防出錯)~今天發(fā)現(xiàn)MYSQL數(shù)據(jù)庫從4.1就開始支持事務(wù)功能,據(jù)說5.0將引入存儲過程^_^
先簡單介紹一下事務(wù)吧!事務(wù)是DBMS得執(zhí)行單位。它由有限得數(shù)據(jù)庫操作序列組成得。但不是任意得數(shù)據(jù)庫操作序列都能成為事務(wù)。一般來說,事務(wù)是必須滿足4個條件(ACID)
原子性(Autmic):事務(wù)在執(zhí)行性,要做到“要么不做,要么全做!”,就是說不允許事務(wù)部分得執(zhí)行。即使因為故障而使事務(wù)不能完成,在rollback時也要消除對數(shù)據(jù)庫得影響!
一致性(Consistency):事務(wù)得操作應(yīng)該使使數(shù)據(jù)庫從一個一致狀態(tài)轉(zhuǎn)變倒另一個一致得狀態(tài)!就拿網(wǎng)上購物來說吧,你只有即讓商品出庫,又讓商品進入顧客得購物籃才能構(gòu)成事務(wù)!
隔離性(Isolation):如果多個事務(wù)并發(fā)執(zhí)行,應(yīng)象各個事務(wù)獨立執(zhí)行一樣!
持久性(Durability):一個成功執(zhí)行得事務(wù)對數(shù)據(jù)庫得作用是持久得,即使數(shù)據(jù)庫應(yīng)故障出錯,也應(yīng)該能夠恢復(fù)!
MYSQL的事務(wù)處理主要有兩種方法。
1、用begin,rollback,commit來實現(xiàn)
begin 開始一個事務(wù)
rollback 事務(wù)回滾
commit 事務(wù)確認(rèn)
2、直接用set來改變mysql的自動提交模式
MYSQL默認(rèn)是自動提交的,也就是你提交一個QUERY,它就直接執(zhí)行!我們可以通過
set autocommit=0 禁止自動提交
set autocommit=1 開啟自動提交
來實現(xiàn)事務(wù)的處理。
但注意當(dāng)你用 set autocommit=0 的時候,你以后所有的SQL都將做為事務(wù)處理,直到你用commit確認(rèn)或rollback結(jié)束,注意當(dāng)你結(jié)束這個事務(wù)的同時也開啟了個新的事務(wù)!按第一種方法只將當(dāng)前的作為一個事務(wù)!
個人推薦使用第一種方法!
MYSQL中只有INNODB和BDB類型的數(shù)據(jù)表才能支持事務(wù)處理!其他的類型是不支持的?。ㄇ杏洠。?BR>MYSQL5.0 WINXP下測試通過~
mysql> use test;
Database changed
mysql> CREATE TABLE `dbtest`(
-> id int(4)
-> ) TYPE=INNODB;
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> select * from dbtest
-> ;
Empty set (0.01 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into dbtest value(5);
Query OK, 1 row affected (0.00 sec)
mysql> insert into dbtest value(6);
Query OK, 1 row affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from dbtest;
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.00 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into dbtest values(7);
Query OK, 1 row affected (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from dbtest;
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.00 sec)
mysql>
*******************************************************************************************************************
function Tran( $sql ) {
$judge = 1;
mysql_query('begin');
foreach ($sql as $v) {
if ( !mysql_query($v) ) {
$judge = 0;
}
}
if ($judge == 0) {
mysql_query('rollback');
return false;
}
elseif ($judge == 1) {
mysql_query('commit');
return true;
}
}
************************************************
<?php
$handler=mysql_connect("localhost","root","");
mysql_select_db("task");
mysql_query("SET AUTOCOMMIT=0");//設(shè)置為不自動提交,因為MYSQL默認(rèn)立即執(zhí)行
mysql_query("BEGIN");//開始事務(wù)定義
if(!mysql_query("insert into trans (id) values('2')"))
{
mysql_query("ROOLBACK");//判斷當(dāng)執(zhí)行失敗時回滾
}
if(!mysql_query("insert into trans (id) values('4')"))
{
mysql_query("ROOLBACK");//判斷執(zhí)行失敗回滾
}
mysql_query("COMMIT");//執(zhí)行事務(wù)
mysql_close($handler);
?>
相關(guān)文章
在Qt中操作MySQL數(shù)據(jù)庫的實戰(zhàn)指南
QT連接Mysql數(shù)據(jù)庫的步驟相對繁瑣,但是也是一個不錯的學(xué)習(xí)經(jīng)歷,下面這篇文章主要給大家介紹了關(guān)于在Qt中操作MySQL數(shù)據(jù)庫的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04Mysql樹形結(jié)構(gòu)的數(shù)據(jù)庫表設(shè)計方案
樹形結(jié)構(gòu)對大家來說應(yīng)該都不陌生,在日常開發(fā)中經(jīng)常會遇到,下面這篇文章主要給大家介紹了關(guān)于Mysql樹形結(jié)構(gòu)的數(shù)據(jù)庫表設(shè)計的相關(guān)資料,文中通過示例代碼的非常詳細(xì),需要的朋友可以參考下2021-09-09MySQL事務(wù)的ACID特性以及并發(fā)問題方案
這篇文章主要介紹了MySQL事務(wù)的ACID特性以及并發(fā)問題方案,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07重置MySQL數(shù)據(jù)庫root密碼(linux/windows)
linux與windows下重置mysql用戶名與密碼的方法,需要的朋友可以參考下。2010-12-12MySQL 5.6 解壓縮版安裝配置方法圖文教程(win10)
這篇文章主要為大家詳細(xì)介紹了MySQL for Windows 解壓縮版安裝配置的相關(guān)資料,需要的朋友可以參考下2016-07-07Unity連接MySQL并讀取表格數(shù)據(jù)的實現(xiàn)代碼
本文給大家介紹Unity連接MySQL并讀取表格數(shù)據(jù)的實現(xiàn)代碼,實例化的同時調(diào)用MySqlConnection,傳入?yún)?shù),這里的傳入?yún)?shù)個人認(rèn)為是CMD里面的直接輸入了,string格式直接類似手敲到cmd里面,完整代碼參考下本文2021-06-06mysql Event Scheduler: Failed to open table mysql.event
這篇文章主要介紹了mysql Event Scheduler: Failed to open table mysql.event,需要的朋友可以參考下2016-04-04