A. php mysql commit之後還可以rollback么
事務(transaction)是由查詢和/或更新語句的序列組成。 用 begin、start transaction
開始一個事務,rollback 回滾事務,commit 提交事務。 在開始一個事務後,可以有若干個 SQL 查詢或更新語句,每個 SQL
遞交執行後,還應該有判斷是否正確執行的語句,以確定下一步是否回滾,若都被正確執行則最後提交事務。
事務一旦回滾,資料庫則保持開始事務前狀態。就好象一個被編輯的文件不存檔退出,自然還是保持文件原來的樣子。
所以,事務可被視為原子操作,事務中的 SQL,要麼全部執行,要不一句都不執行。
人家的回答,編輯文件可以理解吧
B. php 開啟mysql事務,會自動提交么
您好,MySQL提交方式autocommit默認開啟,這種模式本身就是以每次查詢為一次單獨的事務。
當開啟事務後,直到執行commit語句才會提交,所以不會自動提交,否則我們開啟事務也沒有意義了呀。
希望能幫到您。
C. 關於Thinkphp 事務處理 mysql 插入獲取ID的問題。
$sql_exist="select * from ".C('blog_info')." where title='$title'"; $count1 =$Info_obj->execute($sql_exist); if(empty($count1)){ $checkadmin=new Model; import('Think.Util.Input'); //調用當前Session值。 $adminuser=trim(Session::get(C('USER_AUTH_NAME'))); //echo $adminuser; //echo lll; date_default_timezone_set("PRC"); $act_time=date("Y-m-d H:i:s"); $sql="insert into ".C('blog_info')." set title='$title',content='$content'"; //李盯$id=mysql_insert_id(); $action="哪猛和添加了id為".$id."的記錄"; $in_log="insert into ".C('blog_log')." set adser='$adminuser'知脊,action='".$action."',act_time='$act_time'"; $count =$Info_obj->execute($sql); $count2=$Info_obj->execute($in_log); if(!empty($count)&&!empty($count2)){ //$s_log =$Info_obj->query($sql_log); $Info_obj->commit(); return $count;} else{ $Info_obj->rollback; return 3; } //return $s_log; }else{ return 3; } 用mysql_insert_id();是在第一條數據執行之後生成的, 事務處理時 兩條sql是同時進行。 這樣就獲取不到ID值。
D. php mysql 事務怎麼寫
去官方文檔 其實就是開啟事務 綁定事物 回滾或者通過 提交事物
E. 談談你對 mysql 事務的認識 我是php初學者不懂這個 想請教大神教我
先族或簡單介紹一下事務吧!事務是DBMS得執行單位。它由有限得資料庫操作序列組成得。但不是任意得資料庫操作序列都能成為事務。一般來說,事務是必須滿足4個條件(ACID)
原子性(Autmic):事務在執行性,要做到「要麼不做,要麼全做!」,就是說不允許事務部分得執行。即使因為故障而使事務不能完成,在rollback時也要消除對資料庫得影響!
一致性(Consistency):事務得操作應該使使資料庫從一個一致狀態轉變倒另兆州伍一個一致得狀態!就拿網上購物來說吧,你只有即讓商品出庫,又讓商品進入顧客得購物籃才能構成事務!
隔離性(Isolation):如果多個事務並發執行,應象各個事務獨立執跡灶行一樣!
持久性(Durability):一個成功執行得事務對資料庫得作用是持久得,即使資料庫應故障出錯,也應該能夠恢復!
MYSQL的事務處理主要有兩種方法。
1、用begin,rollback,commit來實現
begin
開始一個事務
rollback 事務回滾
commit 事務確認
2、直接用set來改變mysql的自動提交模式
MYSQL默認是自動提交的,也就是你提交一個QUERY,它就直接執行!我們可以通過
set autocommit=0
禁止自動提交
set autocommit=1 開啟自動提交
來實現事務的處理。
但注意當你用 set
autocommit=0
的時候,你以後所有的SQL都將做為事務處理,直到你用commit確認或rollback結束,注意當你結束這個事務的同時也開啟了個新的事務!按第一種方法只將當前的作為一個事務!
個人推薦使用第一種方法!
MYSQL中只有INNODB和BDB類型的數據表才能支持事務處理!其他的類型是不支持的!(切記!)
下次有空說下MYSQL的數據表的鎖定和解鎖!
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>
*******************************************************************************************************************
[PHP]
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]
************************************************
<?php
$handler=mysql_connect("localhost","root","");
mysql_select_db("task");
mysql_query("SET
AUTOCOMMIT=0");//設置為不自動提交,因為MYSQL默認立即執行
mysql_query("BEGIN");//開始事務定義
if(!mysql_query("insert
into trans (id)
values('2')"))
{
mysql_query("ROOLBACK");//判斷當執行失敗時回滾
}
if(!mysql_query("insert
into trans (id)
values('4')"))
{
mysql_query("ROOLBACK");//判斷執行失敗回滾
}
mysql_query("COMMIT");//執行事務
mysql_close($handler);
?>
引自:http://www.cnblogs.com/in-loading/archive/2012/02/21/2361702.html
F. php 面試必考題 mysql的MyISAM 和 InnoDB 的區別
1.InnoDB不支持FULLTEXT類型的索引。
2.InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from
table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。注意的是,當count(*)語句包含
where條件時,兩種表的操作是一樣的。
3.對於AUTO_INCREMENT類型的欄位,InnoDB中必須包含只有該欄位的索引,但是在MyISAM表中,可以和其他欄位一起建立聯合索引。
4.DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除。MyISAM 是表所
innodb是行鎖
5.LOAD TABLE FROM MASTER(從主負載表)操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導入數據後再改成InnoDB表,但是對於使用的額外的InnoDB特性(例如外鍵)的表不適用。
另外,InnoDB表的行鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的范圍,InnoDB表同樣會鎖全表,例如update
table set num=1 where name like 「"2%」
6.InnoDB 支持事物
選擇存儲引擎 根據實際情況選擇。
一般情況下如果查詢多建議使用myIsam 。
如果你需要事務處理或是外鍵,那麼InnoDB 可能是比較好的方式。
優化MYSQL資料庫的方法:
1,選取最適用的欄位屬性,盡可能減少定義欄位長度,盡量把欄位設置NOT NULL,例如'省份,性別',最好設置為ENUM
2,使用join代替子查詢
3,使用聯合(UNION)來代替手動創建的臨時表
4,事務處理(保證數據完整性,例如添加和修改同時,兩者成立則都執行,一者失敗都失敗)
5,適當建立索引(如何建立索引?索引的利與弊?)
6,優化sql語句
7,explain可以看到mysql執行計劃
8,分表(垂直分表,水平分表?)
9,資料庫主從
G. php mysql事務能解決什麼問題
1、用begin,rollback,commit來實現
begin 開始一個事務
rollback 事務回滾
commit 事務確認
2、直接用set來改變mysql的自動提交模式
MYSQL默認是自動提交的,也就是你提交一個QUERY,它就直接執行!我們可以通過
set autocommit=0 禁止自動提交
set autocommit=1 開啟自動提交
來實現事務的處理。
H. php mysql 事務怎麼寫
mysql_query("begin");
mysql_query("commit");
mysql_query("rollback"改伏旅廳耐);
mysql_query("核凳end");
直接這樣寫就可以了
I. php mysql 事務無法回滾 rollback不起作用
MYSQL中只有INNODB和BDB類型的數據表才能支持事務處理,其他的類型是不支持的.
你可以檢查下你的資料庫用的什麼引擎