mysql

事务问题。

在一次开发过程中,发现mysql事务rollback没有起作用,研究了一下,发现事务还有如下特点:

1、auto_increment值不会被rollback

2、不是所有语句都支持事务,如create table和alter table不支持事务。

3、如果一个事务中的某条语句不支持事务(比如有一条create table语句),那么所有查询都将被执行,不会rollback。

4、当发生3的情况时,数据库查询记录上仍显示:

BEGIN

INSERT INTO ......

CREATE TABLE ......

ROLLBACK

这时虽然显示rollback,实际上数据库内容并没有rollback,insert语句和create语句都被数据库执行了。

 

按查询顺序排序:

select id from users where id in (2,1,5,3,4);

返回结果为:1,2,3,4,5

select id from users where id in (2,1,5,3,4) order by field(id,2,1,5,3,4);

返回结果为:2,1,5,3,4

 

mysql配置变量(show variables like '%max%';)

max_allowed_packet                数值在16M以上,如:20971520(20M)这个参数限制mysql返回数据量的大小。
innodb_buffer_pool_size           数值调高,如:536870912(512M)
query_cache_size                  调高,如:16777216(16M)
query_cache_type                  调成ON
以上配置对mysql影响比较大
如果想开启慢查询log,修改以下变量数值:
long_query_time                   0.400000
slow_query_log                    ON
slow_query_log_file               /var/run/mysqld/mysqld-slow.log

 

redis

rails使用resque处理任务,用命令行插入数据:

redis-cli sismember resque:queues email_queue        # 1 or 0
redis-cli sadd resque:queues email_queue    #如果上句返回值是0


redis-cli rpush resque:queue:email_queue '{"class":"Email","args":[902,5,6]}'
redis-cli rpush resque:queue:mailer '{"class":"Mailer","args":["email",5,{"from":"abc@def.ghi","email_id":1}]}'

失败任务重新加入队列:

(Resque::Failure.count-1).downto(0).each do |i|
  Resque::Failure.requeue(i)
  Resque::Failure.remove(i)
end