极品黑公子 2007-12-4 10:40
锁定
支持事务的数据库类型会如下处理
(isam,myisam,heap数据表类型不支持事务innoDB
BDB支持事务)
$sql1 = "set auto_commite=0";
$sql2 = "begin";
$sql3 = "update......";
$sql4 = "update.......";
$sql5 = "commite";
$sql6 = "rollback";
mysql_query($sql1);
mysql_query($sql2);
mysql_query($sql3);
mysql_query($sql4);
if(mysql_errno)
mysql_query($sql5);
else
mysql_query($sql6);
不是所有的类据库类型都支持事务,所以就不支持rollback,想要在数据发生不一致时,得到相应的处理很难
mysql以锁表的形式解决
LOCK TABLES 表 WRITE;
INSERT INTO 表 VALUES ( XX );
UPDATE 该表 SET 字段= XXX WHERE XXX ;
UNLOCK TABLES;
在手册中有这一段话算是对读 写锁定的定义:
写操作时,需要申请一个独占性的锁,也就是说在写操作其间,该表只能由写操作的客户使用。读操作时,客户必须申请一个允 许其他客户对数据表进行写操作的锁,以确保客户在读的过程中数据表不会发生改变。但读操作锁不是独占的,可有多个读操作同时作用于同一个数据表。
LOCK TABLES trans READ, customer WRITE;
SELECT SUM(value) FROM trans WHERE customer_id=some_id;
//锁定之后这里是不会再有其它线程操作数据库,mysql处理操作是以线程为基本处理单位的
UPDATE customer;
SET total_value=sum_from_previous_statement WHERE customer_id=some_id; UNLOCK TABLES;
锁定表可以加快插入、更新或删除的速度,保证数据在做一系列动作时不被打扰,但又只限定在单用户上,别人不能对他锁定的表进行操作
[[i] 本帖最后由 极品黑公子 于 2007-12-4 10:41 编辑 [/i]]