在做数据同步校验的时候,需要从mysql fetch数据和hbase的数据进行对比,发现即使mysql数据变化了,类似下面的代码返回的值还是之前的数据。抽取的代码大概如下:
1 import MySQL 2 3 conn = MySQL.connect(host = mysql_config[‘host‘], 4 user = mysql_config[‘username‘], 5 password = mysql_config[‘password‘], 6 port = int(mysql_config[‘port‘]), 7 db = mysql_config[‘database‘], 8 init_command = ‘SET NAMES UTF8‘) 9 10 cur = conn.cursor() 11 12 def get_data_from_mysql(): 13 sql = "select * from table_a where ****" 14 cur.execute(sql) 15 result = [] 16 for line in cur.fetall(): 17 result.append(line) 18 19 return result
上面的代码,如果反复调用get_data_from_mysql函数,即使对于mysql数据库中同样一条数据变化,程序取出的还是变化之前的数据。
原因解释:这是mysql事务隔离的结果,InnoDB默认的隔离级别是可重复读(REPEATABLE READ),也就是在同一个事务中读取的值总是一样。所以为了感知到变化,必须重新获取一个事务(比方说关闭conneciton重新获取,或者调用commit,也可以改变mysql的事务隔离级别到READ COMMITED)。
参考资料:http://stackoverflow.com/questions/29680684/why-do-i-need-to-reconnect-to-the-database-to-see-changes-in-table-data
时间: 2024-11-21 06:49:37