多线程带来的困扰 lz的问题应该没有那么复杂,做好数据库的事务处理就好了。如果用Mysql的话,桌面引擎使用InnoDB,搜索的时候用select update语法,这样的话,一直到下次rollback/commit,数据一直都会被锁住。多少个线程都无所谓。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 N个线程通过1个入口访问一个持续的数据。转发给别的合作方是什么意思?唯一约束是什么?这不是典型的transaction processing? 那个问题我已经通过将不希望重复的字段增加UNIQUE解决了。转发给别的合作方的意思就是,你通过http协议,带一些参数,访问我的接口,我收到后,还要再去请求其他合作方,把这些参数通过http协议传给他们。现在数据库可以避免插入重复数据了,但我的php程序不会exit(),因为无法通过什么方法来告诉程序该exit了()。我希望当数据库中有重复数据的时候,程序也能exit(),事务处理也跟唯一约束在这里的作用一样,只能避免重复数据插入,并不能让程序也exit()。目前这似乎没什么别的办法。我很多合作方也遇到这个问题没法解决,幸亏我们的数据并不要求非常精确。 你:通过http请求,带了3个参数,arg1,arg2,arg3->我:1 接收$_REQUEST['arg1'],$_REQUEST['arg2'],$_REQUEST['arg3'];2 插入数据库,如果arg2在数据库中存在,exit(),否则插入。...last 通过http请求将arg1,arg2,arg3其他合作方接口->他:...我现在最大的问题是在我那里第2步的时候,程序不能够停下来,还会继续下面的步骤。对方单线程发包的话,先用arg2在数据库中查询,返回数量>0,就exit()。如果多线程并且发包密集的话,程序滤重将会失效,这时可以利用唯一约束或事务处理。使用UNIQUE和Transactions Processing能保证数据库插入的值唯一,但是不能让程序停止下来。而且,我的表已经有了N多数据,这些表类型都是myisam,如果将数据库引擎更改为innodb不得不说实在有点这些数据还要经常做查询,我们对实时数据也是要求很高的,myisam在查询检索方面要强于innodb。 如果用myisam,可以使用程序锁$overtime=5;//超时时间$lockStr=$_REQUEST['arg2'];//需要锁定得关键值$query="select GET_LOCK($lockStr,$overtime) ";//锁定$res = @mysql_query($query);//为true,成功锁定/*干一些事,比如查询 $_REQUEST['arg2'] 是否存在 $query="select * from tableName WHERE fieldName='".$lockStr.'";mysql_query($query);在这段时间中,如果还有其他进程,使用一样的关键值的 sql操作,将被阻塞,直到本进程解锁当然在这里,你在一开始的时候,就可以使用 IS_FREE_LOCK /IS_USED_LOCK 来判断关键值 的锁当前是否被占用,是的话就可以退出了。具体手册上有*/$query="select RELEASE_LOCK($lockStr) ";//解锁$res = @mysql_query($query); 可能是我到现在还不太清楚到底要做什么。看lz的一些做法很反常规。MyISAM桌面引擎只适合于没有复杂事务处理的web程序。如果有复杂事务处理的系统,MyISAM桌面引擎,无法保证数据的一贯性。锁表的话,效率更低。数据库事务处理的控制在AP服务器实现是不现实的,几乎相当于开发1/3个RDB,而且用PHP似乎无法实现。myisam在查询检索方面要强于innodb,但是具体强多少,做过性能测试吗?速度不代表一切,连系统数据的质量都保证不了的话,再快有什么用?如果像lz所说,对数据要求较高,为什么不考虑数据库或者数据的多重化?其他的不说,web开发中以下这两条是想都不需要想的1 升级服务器 如果google找lz开发个小程序,还要附带升级上万台服务器吗? ——Google半个月的收支都要赤字的话,够上头条的了。5 要求所有合作方采用单线程方式 10客户*1线程和5客户*2线程有本质区别吗? web程序的前提就是多线程,如果真的只有一个线程,应该有比web更好的选择。 RDB提供了在多用户系统中,对单一的永持续的数据进行操作的大多数功能并将他们封装,不要让他们闲着。 1。用affected_rows判断实际插入是否成功,失败就退出不就行了吗?2。使用事务处理是更好的方法, innodb的速度问题没有那么严重, 你自己可以测试一下 PHP中的一个while循环 PHP获取当前增加信息的ID 类似PC9kaXY的代码如何解码? 获取Mysql表的信息 秀下我的AJAX留言本 哪位好心人给我解释一下PHP的版本都是什么意思! 请教这个变量是怎么算出来的,谢谢 表格边框变为虚线 求助如下C#代码加密方法,如何使用php 实现? 求帮忙看一下,发红包算法,要求每人最低分到一块,怎么改?! 大家来帮帮我啊!急 菜虫求教:浏览器中的中文链接名称如何反显示
唯一约束是什么?这不是典型的transaction processing?
那个问题我已经通过将不希望重复的字段增加UNIQUE解决了。转发给别的合作方的意思就是,你通过http协议,带一些参数,访问我的接口,我收到后,还要再去请求其他合作方,把这些参数通过http协议传给他们。现在数据库可以避免插入重复数据了,但我的php程序不会exit(),因为无法通过什么方法来告诉程序该exit了()。我希望当数据库中有重复数据的时候,程序也能exit(),事务处理也跟唯一约束在这里的作用一样,只能避免重复数据插入,并不能让程序也exit()。目前这似乎没什么别的办法。我很多合作方也遇到这个问题没法解决,幸亏我们的数据并不要求非常精确。
通过http请求,带了3个参数,arg1,arg2,arg3
->
我:
1 接收$_REQUEST['arg1'],$_REQUEST['arg2'],$_REQUEST['arg3'];
2 插入数据库,如果arg2在数据库中存在,exit(),否则插入。
...
last 通过http请求将arg1,arg2,arg3其他合作方接口
->
他:
...
我现在最大的问题是在我那里第2步的时候,程序不能够停下来,还会继续下面的步骤。对方单线程发包的话,先用arg2在数据库中查询,返回数量>0,就exit()。如果多线程并且发包密集的话,程序滤重将会失效,这时可以利用唯一约束或事务处理。使用UNIQUE和Transactions Processing能保证数据库插入的值唯一,但是不能让程序停止下来。而且,我的表已经有了N多数据,这些表类型都是myisam,如果将数据库引擎更改为innodb不得不说实在有点
这些数据还要经常做查询,我们对实时数据也是要求很高的,myisam在查询检索方面要强于innodb。
$lockStr=$_REQUEST['arg2'];//需要锁定得关键值
$query="select GET_LOCK($lockStr,$overtime) ";//锁定
$res = @mysql_query($query);//为true,成功锁定/*
干一些事,比如查询 $_REQUEST['arg2'] 是否存在
$query="select * from tableName WHERE fieldName='".$lockStr.'";
mysql_query($query);在这段时间中,如果还有其他进程,使用一样的关键值的 sql操作,将被阻塞,直到本进程解锁
当然在这里,你在一开始的时候,就可以使用 IS_FREE_LOCK /IS_USED_LOCK 来判断关键值 的锁当前是否被占用,是的话就可以退出了。具体手册上有
*/$query="select RELEASE_LOCK($lockStr) ";//解锁
$res = @mysql_query($query);
看lz的一些做法很反常规。MyISAM桌面引擎只适合于没有复杂事务处理的web程序。
如果有复杂事务处理的系统,MyISAM桌面引擎,无法保证数据的一贯性。
锁表的话,效率更低。
数据库事务处理的控制在AP服务器实现是不现实的,几乎相当于开发1/3个RDB,而且用PHP似乎无法实现。myisam在查询检索方面要强于innodb,但是具体强多少,做过性能测试吗?
速度不代表一切,连系统数据的质量都保证不了的话,再快有什么用?
如果像lz所说,对数据要求较高,为什么不考虑数据库或者数据的多重化?其他的不说,web开发中以下这两条是想都不需要想的
1 升级服务器
如果google找lz开发个小程序,还要附带升级上万台服务器吗?
——Google半个月的收支都要赤字的话,够上头条的了。
5 要求所有合作方采用单线程方式
10客户*1线程和5客户*2线程有本质区别吗?
web程序的前提就是多线程,如果真的只有一个线程,应该有比web更好的选择。
RDB提供了在多用户系统中,对单一的永持续的数据进行操作的大多数功能并将他们封装,不要让他们闲着。
innodb的速度问题没有那么严重,
你自己可以测试一下