1、pymysql默认开启事务,对于表的数据的操作需要使用commit,
但是如果删库删表的操作就不一样,没办法rollback
一般来说用如下方法使用事务,如果不需要使用事务则不用rollback,直接commit就可以
try:
cursor.execute("update moneyTable set money = money - 50 where name = '小明'")
#如果小花的账户出问题了 无法更新数据 那就需要回滚
cursor.execute("update moneyTable set money = money + 50 where name = '小花'")
conn.commit()
except:
conn.rollback()
2、select语句需要commit吗。
首先,mysql如果直接select,是默认自动commit,而pymysql是默认开启事务(需要手动commit)
而是否要commit取决于师傅需要重复读, repeatable read,如果每次都要读取最新的更新,则需要commit。
如果要在事务内重复读,则不需要commit,这与隔离级别有关。
mysql默认隔离级别是repeatable read,
四个级别分别是 read uncommited 很少用, read commited也叫nonrepeatable read,事务内不可重复度。 repeatable read解决了脏读,
事务隔离级别 脏读 不可重复读 幻读 读未提交(read uncommitted) 是 是 是 不可重复读(read committed) 否 是 是 可重复读(repeatable read) 否 否 是 串行化(serializable) 否 否 否
作者:一只贱熊猫
链接:https://juejin.cn/post/6844903681196982285
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
3、
一般来说connection可以保持,每次执行前使用conn.ping(reconnect=True)进行测试
而cursor每次使用后都要关闭,最好使用
with conn.execute(sql) as cursor