import cx_Oracle # 连接Oracle数据库 dsn = cx_Oracle.makedsn(host='localhost', port=1521, sid='orcl') connection = cx_Oracle.connect(user='yourusername', password='yourpassword', dsn=dsn) # 插入数据并校验 cursor = connection.cursor() try: for batch in batches: cursor.execute("BEGIN") for row in batch: cursor.execute("INSERT INTO yourtable (col1, col2, col3) VALUES (:1, :2, :3)", row) cursor.execute("COMMIT") # 数据校验 cursor.execute("SELECT count(*) FROM yourtable") count = cursor.fetchone()[0] if count != len(results): raise Exception("数据校验失败") except Exception as e: print(e) connection.rollback() finally: cursor.close() connection.close(),如果在后面循环中发生异常也会回滚前面循环已经提交的事务吗,为什么请解释下
时间: 2024-04-01 08:35:54 浏览: 133
连接oracle数据库cx_Oracle
5星 · 资源好评率100%
在以上代码中,如果在后面的循环中发生异常,会回滚整个事务,包括前面已经提交的批次。这是因为整个操作是在一个事务中进行的,如果发生异常,则会回滚整个事务,而不是只回滚当前批次的操作。
在每个批次之后,都有一个 `COMMIT` 操作,这会将当前批次的操作提交到数据库中并结束当前事务。如果在后面的批次中发生异常,由于整个操作是在同一个事务中进行的,因此整个事务都会被回滚,包括之前已经提交的批次。
如果需要在每个批次中启动一个独立的事务,可以将 `BEGIN` 和 `COMMIT` 操作移动到循环内部,这样每个批次都会在自己的事务中执行,如果发生异常,只会影响当前批次的操作。
阅读全文