问题描述
|
让我们创建Page.PHP
query1
query2
query3
有什么方法可以锁定几个表,因此,如果一个用户访问Page.PHP,而第二个用户稍后再打开此页面,则第二个用户将需要等到第一个用户的所有查询执行完毕。
更重要的是,如果同一页面上同时有数百个用户,这会大大降低网站的速度吗?
谢谢。
解决方法
您可以使用行级别锁定来导致其他用户的连接阻塞。
BEGIN TRAN
UPDATE table1 set locked = 1; //table locks are only taken out when data is written,you could possibly also use lock hints.
UPDATE table2 set locked = 1;
UPDATE table3 set locked = 1;
//Tables are locked,do whatever you need here,other users hitting the page will block at the first update statement until this connection hits the commit or rollback
update table1 set locked = 0;
update table2 set locked = 0;
update table3 set locked = 0;
COMMIT
请注意,尽管您可以使用锁定提示使它锁定行,但select语句绝不会导致对行或表的锁定。最好的选择是通过将行中的值设置为自身或添加另一列来触摸行。
数据库表现良好,因为它们可以容纳并发。每当您导致并发串行操作时,都将导致性能下降。在某些情况下,这可能还可以,这实际上取决于您实际使用它的方式。
我更像是一个SQL Server专家,但这是非常通用的DBMS概念,有关更多信息,我将进行研究:
交易隔离级别
http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html
锁定提示
http://www.xaprb.com/blog/2006/08/05/how-to-give-locking-hints-in-mysql/
行/表锁定机制
http://dev.mysql.com/doc/refman/5.5/en/internal-locking.html
,
有什么办法可以锁定几张桌子
您可以使用锁定表来执行此操作,但是这会降低页面速度
更重要的是,它会减慢
网站非常多,如果有一些
同一页面上的数百个用户
同时?
如果这样做的话,它会减慢您的页面速度。
http://dev.mysql.com/doc/refman/5.0/en/lock-tables-restrictions.html:
您也可以避免将表锁定在
在某些情况下,使用用户级别
咨询锁定功能GET_LOCK()和
RELEASE_LOCK()。这些锁已保存
在服务器中的哈希表中
用pthread_mutex_lock()实现
和pthread_mutex_unlock()为高
速度。参见第11.14节,
“其他功能”。
我仍然认为,就像其他人告诉您的那样,您应该只使用交易。
附注:您敢尝试实现什么目标,我敢保证有一种更好的方法可以实现这一目标。可能甚至没有锁/事务。