Heim  >  Artikel  >  Backend-Entwicklung  >  请问并发写入数据库,如何保持唯一性啊

请问并发写入数据库,如何保持唯一性啊

WBOY
WBOYOriginal
2016-06-23 13:59:211268Durchsuche


//a,b两个请求并发  注册相同用户名 username='myname'$is_user = "SELECT username FROM users WHERE username='myname'";if(!$is_user){	echo ("INSERT INTO users (username) VALUES ('myname')");}


假如表中字段未设置唯一索引,程序上如何控制唯一性啊
a,b同时查询表,结果是可以注册的,所以都执行了insert,但用户名相同,这样数据就不唯一了。是会这样吗,如何避免呢?


回复讨论(解决方案)

数据库加锁操作

数据库加锁操作
读锁  好像是共用的啊,大家可以同时读,所以出现了错误结果。

怎么不加个unique key呢。

最简单的方法数据库加unique key

复杂一点:
单台web机器,使用本地文件锁flock,一个用户名一个本地文件
多台机器 ,使用memcache inc 实现锁机制 http://ju.outofmemory.cn/entry/48924

了解了,谢谢各位。

我也只是偶尔想到的,如果不是唯一索引,用什么方法来解决这个问题。

最简单的方法数据库加unique key

复杂一点:
单台web机器,使用本地文件锁flock,一个用户名一个本地文件
多台机器 ,使用memcache inc 实现锁机制 http://ju.outofmemory.cn/entry/48924
再请教一下 memcache。

$v = $memcache->get ( $key );
if ($v === false) {
$memcache->set ( $key, 0 );
}
$index = $memcache->increment ( $key, 1 );

两个并发请求a,b   会同时get($key)吗
然后a set($key),再b set($key) 不就被后者覆盖了吗

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn