下面是在 MySQL 中使用事务支持的示例。假设有两个表USERTBL和EMAILTBL。让我们考虑一下 innodb 引擎,因为它是最受欢迎的交易存储引擎。
CREATE TABLE USERTBL( USERKEY int unsigned not null auto_increment, email varchar(120) not null, name varchar(100) not null,primary key(USERKEY) )type=INNODB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;CREATE TABLE EMAILTBL( EMAILKEY int unsigned not null auto_increment, email varchar(120) not null,primary key(EMAILKEY) )type=INNODB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
现在,作为一个例子,假设我们需要在USERTBL中插入一个新的记录/新用户,然后我们希望在表EMAILTBL中插入用户的电子邮件。如果第一次插入成功,我们只想插入到第二个表中。另外,如果第二个插入失败,我们希望终止事务,这意味着第一个插入将被撤消。
要启动事务,我们需要将auto COMMIT 设置为 FALSE (mysqli_autocommit)
要撤消一个事务,我们使用ROLLBACK语句,该语句还撤消对事务进行的数据库的任何更改,然后终止该事务(mysqli_rollback)
为了将事务中的所有更改保存到数据库,我们使用COMMIT语句。这也终止了事务(mysqli_commit)
下面的类代码片段中的函数dbProcessEmail显示了上面提到的三个案例。
<?phpclass DB{ private $link;public function __construct(){$this->link = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME);if (mysqli_connect_errno()) { printf ("Connect failed: %s\n", mysqli_connect_error());exit(); } }//...public function dbProcessEmail($email,$name){ mysqli_autocommit($this->link,FALSE); mysqli_query($this->link,"INSERT INTO USERTBL(USERKEY,email,name) VALUES('NULL','$email','$name')");if(mysqli_errno($this->link)){ printf("transaction aborted: %s\n", mysqli->error); mysqli_rollback($this->link);return -1; }else{ mysqli_query($this->link,"INSERT INTO EMAILTBL(EMAILKEY,email) VALUES('NULL','$email')");if(mysqli_errno($this->link)){ printf("transaction aborted: %s\n", mysqli->error); mysqli_rollback($this->link);return -1; }else{ printf("transaction succeeded\n"); mysqli_commit($this->link);return 1; } }return -1; } };?>