psycopg事务

1.事务的特性
原子性,要么完成,要么都不完成

2.psycopg的事务特点
在psycopg中,事务是由connection处理的,当第一次一个命令发送给数据库时(开启数据库操作游标),
一个事务就建立了。接下来的sql命令都会在这个事务中执行,不仅仅是这个游标的sql操作命令,其他的只要是同一个连接connection
开启的游标,sql命令都会在这一个事务中进行。
如果有任何sql命令执行失败,事务将终止,不会再有sql命令执行,直到执行了rollback()方法。
代码示例如下:

import psycopg2

conn = psycopg2.connect(host='127.0.0.1', port=5432, user='postgres', password='1', database='postgres')
cursor = conn.cursor()
cursor.execute('insert into test(a,b) values(%s,%s)',(3,'huiyunyun'))
cursor.execute('SELECT a,b FROM test')
data_list = cursor.fetchall()
for item in data_list:
    print(item[0])
print('---------')
cursor.close()
cursor = conn.cursor()
cursor.execute('SELECT a,b FROM test')
data_list = cursor.fetchall()
for item in data_list:
    print(item[0])
print('---------')
cursor.close()
conn.close()
conn = psycopg2.connect(host='127.0.0.1', port=5432, user='postgres', password='1', database='postgres')
cursor = conn.cursor()
cursor.execute('SELECT a,b FROM test')
data_list = cursor.fetchall()
for item in data_list:
    print(item[0])
print('---------')
cursor.close()
conn.close()

运行结果:
【1.png】
connection负责终止事务,执行commit()或者rollback()方法。
关闭连接close()或销毁连接del事务默认rollback

3.自动提交
设置连接为autocommit模式,命令会自动提交,持久化到数据库。

4.with语句使用
示例如下:

with psycopg2.connect(DSN) as conn:
    with conn.cursor() as curs:
        curs.execute(SQL)

connection结束时,没有异常发生,事务commit,否则rollback,结束事务,但是不会调用close()关闭连接;
cursor结束时,会释放与其相关的资源,但事务不会有影响

conn = psycopg2.connect(DSN)

with conn:
    with conn.cursor() as curs:
        curs.execute(SQL1)

with conn:
    with conn.cursor() as curs:
        curs.execute(SQL2)

conn.close()

5.线程安全
多线程使用数据库有两种方式
1)每个线程创建一个connection,使用单独的会话
2)使用相同的connection,使用共同的会话,即同一个事务

posted on 2017-11-16 13:42  迪米特  阅读(1296)  评论(0编辑  收藏  举报

导航