事務(wù)就是指對數(shù)據(jù)庫的多次修改,要么全部成功,要么全部失敗,不能出現(xiàn)部分修改成功,部分修改失敗的情況。
成都創(chuàng)新互聯(lián)公司擁有網(wǎng)站維護技術(shù)和項目管理團隊,建立的售前、實施和售后服務(wù)體系,為客戶提供定制化的網(wǎng)站設(shè)計制作、網(wǎng)站建設(shè)、網(wǎng)站維護、托管服務(wù)器解決方案。為客戶網(wǎng)站安全和日常運維提供整體管家式外包優(yōu)質(zhì)服務(wù)。我們的網(wǎng)站維護服務(wù)覆蓋集團企業(yè)、上市公司、外企網(wǎng)站、商城網(wǎng)站建設(shè)、政府網(wǎng)站等各類型客戶群體,為全球近1000家企業(yè)提供全方位網(wǎng)站維護、服務(wù)器維護解決方案。
PHP下操作mysql數(shù)據(jù)庫要實現(xiàn)事務(wù)提交,需注意以下方面:
1, 數(shù)據(jù)庫表存儲引擎類型設(shè)置為innoDB。默認的mysql表采用MYISAM引擎,是不支持事務(wù)的,因此要采用以下語句變更:
mysql alter table ‘table_name’ engine=innodb;
2,PDO對象設(shè)置要設(shè)置errmode為Exception,否則第16行SQL執(zhí)行出錯,語句也不會跳到catch段去rollback, 而是繼續(xù)向下執(zhí)行直到commit。
begin; sql1; sql2;.......; commit;在commit 中的語句都是事務(wù)的一部分,不過如你問題所說數(shù)據(jù)庫管理系統(tǒng)是mysql 所以需要有個問題需要注意存儲引擎是INNODB和BDB類型的數(shù)據(jù)表才支持事務(wù)處理。
什么是事務(wù)? \x0d\x0a\x0d\x0a事務(wù)是邏輯上的一組操作,組成這組操作的各個單元,要不全都成功要不全都失敗,這個特性就是事務(wù) \x0d\x0a\x0d\x0a注意:mysql數(shù)據(jù)支持事務(wù),但是要求必須是innoDB存儲引擎 \x0d\x0a\x0d\x0a解決這個問題: \x0d\x0a\x0d\x0amysql的事務(wù)解決這個問題,因為mysql的事務(wù)特性,要求這組操作,要不全都成功,要不全都失敗,這樣就避免了某個操作成功某個操作失敗。利于數(shù)據(jù)的安全 \x0d\x0a\x0d\x0a如何使用: \x0d\x0a\x0d\x0a(1)在執(zhí)行sql語句之前,我們要開啟事務(wù) start transaction; \x0d\x0a\x0d\x0a(2)正常執(zhí)行我們的sql語句 \x0d\x0a\x0d\x0a(3)當(dāng)sql語句執(zhí)行完畢,存在兩種情況: \x0d\x0a\x0d\x0a1,全都成功,我們要將sql語句對數(shù)據(jù)庫造成的影響提交到數(shù)據(jù)庫中,committ \x0d\x0a\x0d\x0a2,某些sql語句失敗,我們執(zhí)行rollback(回滾),將對數(shù)據(jù)庫操作趕緊撤銷 \x0d\x0a\x0d\x0a(注意:mysql數(shù)據(jù)支持事務(wù),但是要求必須是innoDB存儲引擎) \x0d\x0amysql create table bank(name varchar(20),money decimal(5,1))engine=innodb defau \x0d\x0alt charset=utf8; \x0d\x0a\x0d\x0amysql inset into bank values('shaotuo',1000),('laohu',5000); \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1000.0 | \x0d\x0a| laohu | 5000.0 | \x0d\x0a+---------+--------+ \x0d\x0a\x0d\x0a------沒有成功“回滾”執(zhí)行rollback \x0d\x0amysql start transaction; //開啟事務(wù) \x0d\x0aQuery OK, 0 rows affected (0.00 sec) \x0d\x0a\x0d\x0amysql update bank set money=money+500 where name='shaotuo'; \x0d\x0aQuery OK, 1 row affected (0.00 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql update bank set moey=money-500 where name='laohu'; \x0d\x0aERROR 1054 (42S22): Unknown column 'moey' in 'field list' \x0d\x0amysql rollback; //只要有一個不成功,執(zhí)行rollback操作 \x0d\x0aQuery OK, 0 rows affected (0.01 sec) \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1000.0 | \x0d\x0a| laohu | 5000.0 | \x0d\x0a+---------+--------+ \x0d\x0a------成功之后 進行commit操作 \x0d\x0amysql start transaction; //開啟事務(wù) \x0d\x0aQuery OK, 0 rows affected (0.00 sec) \x0d\x0a\x0d\x0amysql update bank set money=money+500 where name='shaotuo'; \x0d\x0aQuery OK, 1 row affected (0.01 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql update bank set money=money-500 where name='laohu'; \x0d\x0aQuery OK, 1 row affected (0.00 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql commit; //兩個都成功后執(zhí)行commit(只要不執(zhí)行commit,sql語句不會對真實的數(shù)據(jù)庫造成影響) \x0d\x0aQuery OK, 0 rows affected (0.05 sec) \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1500.0 | \x0d\x0a| laohu | 4500.0 | \x0d\x0a+---------+--------+