Skip to content
This repository has been archived by the owner on Feb 22, 2020. It is now read-only.

Connection obj can't search the right result. #47

Open
ewing333 opened this issue Feb 24, 2014 · 2 comments
Open

Connection obj can't search the right result. #47

ewing333 opened this issue Feb 24, 2014 · 2 comments

Comments

@ewing333
Copy link

I found some problem when using umysql lib.
i use some db pool to reuse the connection obj.

In case gevent timeout during the connection obj searching data from db,then the connection obj can't get right data after. the testing code below,expecting to your solution.

# -*- coding:utf-8 -*-  
# author:Ewing
# date:2014-2-20

''' sql here
CREATE DATABASE test;
USE test;
CREATE TABLE IF NOT EXISTS `tb_user` (
  `UserId` int(11) NOT NULL,
  `LastLoginTime` int(11) NOT NULL,
  PRIMARY KEY (`UserId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `tb_user` (`UserId`, `LastLoginTime`) VALUES
(1, 1392859212);
'''

from gevent import monkey; monkey.patch_all()
import time
from gevent import Timeout
import umysql
c = umysql.Connection()
c.connect('10.1.1.18', 3306, 'root','think1dfh@RUNpadm', 'test', False, 'utf8')

looptime = 100000 # FOR TEST set  1 or 100000
def doing():
    start = time.time()
    for i in xrange(looptime):
        sql = 'UPDATE tb_user SET LastLoginTime = %s WHERE UserId = 1'%int(time.time())
        c.query(sql,())
    runtime = time.time()-start
    print 'do all runtime: %s'%runtime

def afterdoing():
    sql = 'SELECT * FROM tb_user WHERE UserId = 1'
    result_set = c.query(sql,())
    print 'afterdoing result_set:',result_set  #return (1L, 0L) case timeout then <umysql.ResultSet object> nomal

timeout = Timeout(1)
timeout.start()
try:
    doing()
except Timeout:
    print 'Could not complete'

afterdoing()  
print 'end'
@tg123
Copy link

tg123 commented Mar 6, 2014

some dirty data might be read when timeout
add c.query('select 1') to ensure connection was flushed

obviously, it is a bug

def afterdoing():
    sql = 'SELECT * FROM tb_user WHERE UserId = 1'
    c.query('select 1')
    result_set = c.query(sql)
    #print result_set.rows
    print 'afterdoing result_set:',result_set  #return (1L, 0L) case timeout then <umysql.ResultSet object> nomal

@tg123
Copy link

tg123 commented Mar 7, 2014

see my fix #49

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants