Transaction

来源:互联网 发布:ubuntu dns 重启生效 编辑:程序博客网 时间:2024/05/16 05:13
InnoDB支持事务,MyISAM不支持。
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 */
?>


<完>

0 0