esnme / ultramysql

A fast MySQL driver written in pure C/C++ for Python. Compatible with gevent through monkey patching.

Home Page:http://www.esn.me

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Connection obj can't search the right result.

ewing333 opened this issue · comments

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'

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

see my fix #49