我有一个自定义session.set_save_handler来处理我的应用程序的基于数据库的会话。数据库表是innodb类型。我在我的日志文件类型(1205) Lock wait timeout exceeded; try restarting transaction
中看到一些错误,这些错误包含多个线程,这会挂起应用程序。如何使用set save handler在基于PHP数据库的会话中处理“锁定等待超时”错误?
另外,我有一个包含会话处理器回调的一类,并使其成为单例类:
session_set_save_handler(
array($this, "db_open"),
array($this, "db_close"),
array($this, "db_read"),
array($this, "db_write"),
array($this, "db_destroy"),
array($this, "db_gc")
);
在“db_open”的方法,我设置自动提交为false。
在“db_read”的方法,我与会话ID的行做一个SELECT FOR UPDATE
。所以,当我的应用程序执行负载测试。其中有很多ajax调用db更新,我注意到lock wait timeout
错误。
在“db_write”的方法,我做一个明确的“提交”或“回滚”。
我该如何解决这个问题呢?有什么建议么?
- 我应该抓住这些错误,并发出在 读一个明确的“提交”或编写方法来释放锁,然后重试?
- 我应该为“innodb_lock_wait_timeout”
感谢
如果事务处理比指定的超时时间长,该怎么办。我的问题是,在session.set_save_handler中,执行“db_read”方法并在会话中获取锁定后,它不执行“db_write”方法。不知道是什么原因。 – user1040730 2012-03-17 01:00:13