php實現mysql事務處理實例以及在thinkphp裏的運用

上一篇博客詳細講解了mysql的事務處理,以及髒讀、不可重複讀、幻讀的基本概念,今天就整理一下mysql的事務如何運用到php中!因爲個人原因,就分兩部分,一部分是php原生的事務實例,另一部分就是thinkphp(3.23版本,以後其他的實例)的事務實例。


一:php原生實例

以下是一個比較簡單的事務處理的php實例,在給name表新增用戶的同時,也給薪水錶添加數據,這個事務非常簡單。

name表:

CREATE TABLE `name` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) CHARACTER SET utf8 NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

salary表:

 CREATE TABLE `salary` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `uid` int(10) unsigned NOT NULL DEFAULT '0',
  `saray` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

php代碼:

<?php  
$mysqli=new mysqli("localhost","root","root","test");
if(mysqli_connect_error()){
	printf("Connect fail:%s \n",mysqli_connect_error());
	exit();
}
if(!$mysqli->set_charset("utf8")){
	printf("Character set utf8: %s is fail \n", $mysqli->error);
	exit;
}


if(!$mysqli->query("set autocommit=0")){
	printf("Set autocommit: %s is fail \n", $mysqli->error);
	exit;	
}


if(!$mysqli->query("start transaction")){
	printf("Start transaction %s is fail \n",$mysqli->error());
	exit;
}


$sql1=$mysqli->query("insert into name(name) values('lili')");
$uid=$mysqli->insert_id;
$sql2=$mysqli->query("insert into salary(uid,salary) values('".$uid."',1000)");
if(!$sql1||!$sql2){
	$mysqli->query("rollback");
	printf("Commit: %s is fail \n", $mysqli->error);
	exit;
}
$mysqli->query("commit");
echo "提交成功";
$mysqli->close();


二:thinkphp實例(版本爲3.23)

還是上面的例子,表結構一樣。

<?php
namespace Home\Controller;
use Think\Controller;
class TransController extends Controller{


	public function ceshi(){
		$test=M('name');
		$salary=M('salary');


		$test->execute("set autocommit=0");
		$test->execute("start transaction"); //另一種寫法:$test->startTrans();


		$n_data['name']="lin";
		$sql1=$test->field('name')->data($n_data)->add();		
		$s_data['uid'] = $sql1['id'];
		$s_data['salary']=1000;
		$sql2=$salary->data($s_data)->add();


		if(!$sql1&&!$sql2){
			$test->execute('rollback');
			return;
		}
		$test->execute('commit');//另一種寫法:$text->commit();
		echo "提交成功";
	}
}

以上的簡單實例基本介紹了事務的在原生php和thinkphp3.23版本上的運用,由於例子簡陋,有些地方也沒有涉及,以後有時間再繼續補充!



發佈了52 篇原創文章 · 獲贊 121 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章