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
,使用共同的会话,即同一个事务