Linux下PostgresQL数据库C语言接口:libpq (三)控制事务

来源:互联网 发布:淘宝联盟刷点击数 编辑:程序博客网 时间:2024/05/01 16:49

转载请注明本文出处 本人博客:leonidasFlames的blog 链接为:Linux下PostgresQL数据库C语言接口:libpq (三)控制事务

 

三、libpq库下C语言程序对PostgresQL的控制事务

1.事务的概念

 

事务是指单个逻辑工作单元执行的操作的集合。通过事务处理,保证了数据库中数据的一致性。事务需要满足ACID属性,即Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)

所谓事务的原子性,是指同一个事务中所有执行的操作,要么全部成功,要么全都不会执行,即会退回到这个操作执行之前的状态。

所谓事务的一致性,是指一个事务操作执行完成之后,数据库中数据必须处于合法一致的状态中。如果事务在执行时,数据库中的数据没有保持合法一致的状态,即出现了非法的数据,那么数据库管理系统就会把数据库恢复到该事务执行之前的那个合法的状态中。

所谓事务的隔离性,是指事务看到的数据库中数据要么是这个事务被修改之前的状态,要么是这个事务被修改之后的状态。多个事务可以并发执行,在执行的过程中彼此不会受影响。

所谓事务的持久性,是指如果一个事务被成功地修改,其结果在数据库中不会因为软件、硬件、系统等故障而改变,也不会因为数据库中的其他操作而受到影响。

 

2. 控制事务的语句

 

(1)开始事务  STARTTRANSACTION  [事务名  或者 BEGIN

(2)提交事务  COMMIT  [事务名            或者 END

(3)回滚事务  ROLLBACK  [TO保存点]

(4)保存点    SAVEPOINT 保存点

 

保存点是事务中的一个特殊记号,它允许将那些在它建立后执行的命令全部回滚,把事务的状态恢复到保存点所在的时刻。

 

示例:

建立一个保存点,稍后撤销这个保存点建立后执行的所有的命令的结果:

BEGIN;

    INSERT INTO table1 VALUES (1);

    SAVEPOINT my_savepoint;

    INSERT INTO table1 VALUES (2);

    ROLLBACK TO SAVEPOINT my_savepoint;

    INSERT INTO table1 VALUES (3);

COMMIT;

上面的事务将插入数值 1 3,而不会插入 2

建立并稍后删除一个保存点:

BEGIN;

    INSERT INTO table1 VALUES (3);

    SAVEPOINT my_savepoint;

    INSERT INTO table1 VALUES (4);

    RELEASE SAVEPOINT my_savepoint;

COMMIT;

上面的事务将插入 3 4

SQL 要求在另外一个同名保存点建立的时候自动删除前面那个同名保存点。在PostgreSQL里,将保留旧的保存点,但是在回滚或者释放的时候,只使用最近的那个。(释放了新的保存点将导致旧的再次成为ROLLBACK TO SAVEPOINTRELEASE SAVEPOINT 可以访问的保存点。)

 

3. 综合示例:

 

////////事务控制,一个事务启动PGresult* transaction_res;transaction_res=PQexec(conn, "BEGIN");if(PQresultStatus(transaction_res)!=PGRES_COMMAND_OK){cout<<"transaction <BEGIN> ERROR !"<<endl;PQclear(transaction_res);}else{cout<<"transaction <BEGIN> !!!"<<endl;PQclear(transaction_res);}///////一系列的数据库操作int result=0;/** 其他的一系列数据库操作* 标志result==0,表示这些DB操作成功,可以递交* 标识result==1,表示这些DB操作失败,需要回滚* 此处具体代码略*////////事务的递交和回滚if(result==0){transaction_res=PQexec(conn, "END");cout<<"transaction <COMMIT> !"<<endl;if(PQresultStatus(transaction_res)!=PGRES_COMMAND_OK){cout<<"transaction <COMMIT> ERROR !"<<endl;}PQclear(transaction_res);}else{transaction_res=PQexec(conn, "ROLLBACK");cout<<"transaction <ROLLBACK> !"<<endl;if(PQresultStatus(transaction_res)!=PGRES_COMMAND_OK){cout<<"transaction <ROLLBACK> ERROR !"<<endl;}PQclear(transaction_res);}


 

原创粉丝点击