transaction
交易,业务,事务;办理,处理;(一笔)交易,(一项)事务;
durability 耐用,持久。(durable)
例如转账操作:update t1 set money=money-3;
update t2 set money = money+3;
1.基本概念
并非任意的对数据库的操作序列都是数据库事务。数据库事务拥有以下四个特性,习惯上被称之为 ACID特性。原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束,行级锁在commit之前是不能被别人修改。
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中( 不可以rollback)。
InnoDB的事务处理,将整个过程分为两个阶段,1.将操作记录到事务日志,2.根据事务日志判断,如果OK,则提交到数据库,否则全部废弃,即回滚。不是事务的单独操作是按照默认方式自动提交的,事务操作时,通过关闭自动提交,来达到整体提交的效果。
注意:***InnoDB执行的是行级锁,在执行事务时所有相关的行是被锁定的,commit之前其他进程无法对相关数据修改。
2.通过修改autocommit实现
如果设置autocommit为OFF,则当前进程进行的操作在手动提交数据库前只有自己可以看到,别的进程是看不到的。也就是说保存在事务日志中还没有提交到数据库。比如终端A中得设置
set autocommit = 0; //设置自动提交off
update t1 set money = money - 3;
在A终端中中可以看到钱减少,select查看
但是在B终端select看得时候是不会减少的。
在A终端手动放弃操作 rollback;即将事务日志数据删除,因为没有提交到数据库,没有任何影响。
在A终端最终手动提交 commit;则数据会被写到数据库中。
3.通过start transaction/begin实现;
通过set autocommit时,将autocommit设置为ON之前,对所有的语句都有影响。而start transaction的动作,相当于在commit时自动将autocommit设置为OFF。
如果是单个语句用start transaction比较好,用set auto commit后,一定要记住将其设置为ON。
commit,rollback是一致的。
begin和start transaction一样,建议用start transaction。
<?php
$con = mysql_connect("localhost:3306", "root", "test");
mysql_select_db("study");
/* set autocommit方法实现 */
mysql_query("set autocommit=0", $con);
mysql_query("update student set money=money-30", $con);
$data = mysql_fetch_array(mysql_query("select * from student", $con));
echo "before rollback: " . $data["money"] . "<br>";
mysql_query("rollback");
$data = mysql_fetch_array(mysql_query("select * from student", $con));
echo "after rollback: " . $data["money"] . "<br>";
mysql_query("commit", $con);
<span style="color:#ff0000;">mysql_query("set autocommit=1", $con); /* autocommit开启 */
/* start transaction方法实现 */
mysql_query("start transaction");
mysql_query("update student set money=money-30");
$data = mysql_fetch_array(mysql_query("select * from student", $con));
echo "before rollback: " . $data["money"] . "<br>";
mysql_query("rollback");
$data = mysql_fetch_array(mysql_query("select * from student", $con));
echo "before rollback: " . $data["money"] . "<br>";
mysql_query("commit"); /* 自动开启autocommit */
/* begin方法实现 */
mysql_query("begin");
mysql_query("update student set money=money-30");
$data = mysql_fetch_array(mysql_query("select * from student", $con));
echo "before rollback: " . $data["money"] . "<br>";
mysql_query("rollback");
$data = mysql_fetch_array(mysql_query("select * from student", $con));
echo "before rollback: " . $data["money"] . "<br>";
mysql_query("commit"); /* 自动开启autocommit */
?>
<完>