急急急急急,关于数据库丢失数据的问题 mysql> LOCK TABLES real_table WRITE, insert_table WRITE;mysql> insert into real_table select * from insert_table;mysql> UNLOCK TABLES; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 $my_align = "$article_id.$my_class";$result = mysql_query("SELECT align FROM table WHERE id=$id");$align = mysql_fetch_array($result);$align = $align['align'];$align_info = explode(',', $align);$align_count = count($align_info);$p_class = 0;for ($i=0; $i<$align_count; $i++) { if (!ereg("^$pid\.", $align_info[$i])) { continue; } $p_align_info = explode('.', $align_info[$i]); $p_class = $p_align_info[1]; break;}$is_other = 0;for ($i=$i+1; $i<$align_count; $i++) { $o_align_info = explode('.', $align_info[$i]); $o_class = $o_align_info[1]; if ($o_class <= $p_class) { $align_info[$i] = "$my_align,$align_info[$i]"; $is_other = 1; break; }}if ($is_other) { $align = implode(',', $align_info);} else { $align .= ',' . $my_align;}$set_query = "align='$align'";mysql_query("LOCK TABLES table WRITE");mysql_query("UPDATE table SET $set_query WHERE id='$id'");mysql_query("UNLOCK TABLES"); phpteam(Fanny):这是不允许写的锁定,有没有不允许读的锁定,这个办法没有用,我连着回复了几篇,还是丢失了好几条。 什么意思,没看懂,不允许读,只要把WRITE改为READ就是呀 Table 'hy_list_index' was locked with a READ lock and can't be updated报错,不能用 LOCK TABLES为当前线程锁定表。UNLOCK TABLES释放被当前线程持有的任何锁。当线程发出另外一个LOCK TABLES时,或当服务器的连接被关闭时,当前线程锁定的所有表自动被解锁。 如果一个线程获得在一个表上的一个READ锁,该线程(和所有其他线程)只能从表中读。如果一个线程获得一个表上的一个WRITE锁,那么只有持锁的线程READ或WRITE表,其他线程被阻止。 每个线程等待(没有超时)直到它获得它请求的所有锁。 WRITE锁通常比READ锁有更高的优先级,以确保更改尽快被处理。这意味着,如果一个线程获得READ锁,并且然后另外一个线程请求一个WRITE锁, 随后的READ锁请求将等待直到WRITE线程得到了锁并且释放了它。当线程正在等待WRITE锁时,你可以使用LOW_PRIORITY WRITE允许其他线程获得READ锁。如果你肯定终于有个时刻没有线程将有一个READ锁,你应该只使用LOW_PRIORITY WRITE。 当你使用LOCK TABLES时,你必须锁定你将使用的所有表!如果你正在一个查询中多次使用一张表(用别名),你必须对每个别名得到一把锁!这条政策保证表锁定不会死锁。 注意你应该不锁定任何你正在用INSERT DELAYED使用的表,这是因为在这种情况下,INSERT被一个不同的线程执行。 通常,你不必锁定表,因为所有单个UPDATE语句是原语;没有其他线程能防碍任何其它正在执行SQL语句的线程。当你想锁定表,有一些情况: 如果你将在一堆表上运行许多操作,锁定你将使用的表是较快的。当然缺点是,没有其他线程能更新一个READ锁定的表并且没有其他线程能读一个WRITE-锁定的表。 MySQL不支持事务环境,所以如果你想要保证在一个SELECT和一个UPDATE之间没有其他线程到来,你必须使用LOCK TABLES。下面显示的例子要求LOCK TABLES以便安全地执行: mysql> LOCK TABLES trans READ, customer WRITE;mysql> 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;mysql> UNLOCK TABLES;没有LOCK TABLES,另外一个线程可能有一个机会在执行SELECT和UPDATE语句之间往trans表中插入一个新行。 通过使用渐增更改(UPDATE customer SET value=value+new_value)或LAST_INSERT_ID()函数,在很多情况下你能使用LOCK TABLES来避免。 你也可以使用用户级锁定函数GET_LOCK()和RELEASE_LOCK()解决一些情况,这些锁保存在服务器的一张哈希表中并且用pthread_mutex_lock()和pthread_mutex_unlock()实现以获得高速度. 来自mysql手册 哪位老大知道情况,给解释一下怎么回事! 网站语言求助 有关正则问题 PHP class construct 怎么写? 关于blog的引用通告 PHP的结果集和ASP的记录集就只是叫法上的不同吗 刚才问题已结帖,现在新增问题:如何将session中的内容保存成XML文件? 我想在本机上配个邮件服务器 怎样把.sql文件转换为mysql数据库???请教!! csdn 最近三百篇類似的數据操作怎樣實現的???要每次都計算位置來定位,還是??? 关于LIMIT的一些疑惑…… PHP and Access
$result = mysql_query("SELECT align FROM table WHERE id=$id");
$align = mysql_fetch_array($result);
$align = $align['align'];
$align_info = explode(',', $align);
$align_count = count($align_info);
$p_class = 0;
for ($i=0; $i<$align_count; $i++) {
if (!ereg("^$pid\.", $align_info[$i])) {
continue;
}
$p_align_info = explode('.', $align_info[$i]);
$p_class = $p_align_info[1];
break;
}
$is_other = 0;
for ($i=$i+1; $i<$align_count; $i++) {
$o_align_info = explode('.', $align_info[$i]);
$o_class = $o_align_info[1];
if ($o_class <= $p_class) {
$align_info[$i] = "$my_align,$align_info[$i]";
$is_other = 1;
break;
}
}
if ($is_other) {
$align = implode(',', $align_info);
} else {
$align .= ',' . $my_align;
}
$set_query = "align='$align'";
mysql_query("LOCK TABLES table WRITE");
mysql_query("UPDATE table SET $set_query WHERE id='$id'");
mysql_query("UNLOCK TABLES");
这是不允许写的锁定,有没有不允许读的锁定,这个办法没有用,我连着回复了几篇,还是丢失了好几条。
MySQL不支持事务环境,所以如果你想要保证在一个SELECT和一个UPDATE之间没有其他线程到来,你必须使用LOCK TABLES。下面显示的例子要求LOCK TABLES以便安全地执行:
mysql> LOCK TABLES trans READ, customer WRITE;
mysql> 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;
mysql> UNLOCK TABLES;
没有LOCK TABLES,另外一个线程可能有一个机会在执行SELECT和UPDATE语句之间往trans表中插入一个新行。 通过使用渐增更改(UPDATE customer SET value=value+new_value)或LAST_INSERT_ID()函数,在很多情况下你能使用LOCK TABLES来避免。 你也可以使用用户级锁定函数GET_LOCK()和RELEASE_LOCK()解决一些情况,这些锁保存在服务器的一张哈希表中并且用pthread_mutex_lock()和pthread_mutex_unlock()实现以获得高速度. 来自mysql手册