Qt模块化笔记之sql——事务处理的实现

来源:互联网 发布:电大网站美工期末 编辑:程序博客网 时间:2024/05/22 07:42

所谓事务处理,即将一些sql语句“分块”执行。如果都执行成功了,我们可以commit提交它(让它真正执行),如果其中一处有误,我们可以rollback回滚它(让这个块里的语句都相当于没有执行)。

网上找到的一个比较生动的例子,可以更好理解它的应用:

举例:你去银行转账,转账我们有两步吧,从你账户中取出钱再往他账户中加钱。那这两步银行是必须要确保正确无误的进行的。要被看做成一个事务。其中任何一步出错就算是转账失败,但可能你这时是已经从你账户中扣了钱了,又没往他账户里加钱?怎么办算了?你不肯吧。所以银行会事务回滚,不保存你刚才的操作,即恢复到你没转账之前的状态。


一个事务过程为:开启事务——执行语句——提交或回滚事务。


我们可以使用两种方式实现事务处理:

1,sql数据库语句:

if(db.open())    {        qDebug()<<"打开成功";        QSqlQuery transaction_start;        QSqlQuery transaction_COMMIT;        QSqlQuery transaction_ROLLBACK;        QSqlQuery query_insert;        QSqlQuery query_delete;        transaction_start.exec("START TRANSACTION");//开始事务。使用BEGIN也可以        bool ok1=query_insert.exec("insert into tb_books values('4','Qt模块化笔记4','4')");        bool ok2=query_delete.exec("delete from  tb_books where isbn='20131101183101' ");        qDebug()<<ok1<<ok2;        if(ok1 && ok2)        {            transaction_COMMIT.exec("COMMIT");//提交        }else        {            transaction_ROLLBACK.exec("ROLLBACK");//回滚        }    }

当query_insert和query_delete成功执行时,提交它,让它真正执行……。


如果修改这条语句:

bool ok2=query_delete.exec("delete from  tb_books where isbn='20131101183101' ");

中的tb_books为tb_none后,由于没有tb_none这个表格,导致ok2为false。这时回滚事务,insert操作虽然用exec()执行了,但经过回滚后,它又撤消了,数据库中不会插入数据。


细心的读者可以发现,我们没有在QSqlQuery实例化时直接将语句写入。而是在exec()中执行。这是因为,如果实例化时写入,在我们想象中,所有语句只是被初始化了,然而commit提交时,它们都会被执行。例如我们这样:

QSqlQuery query_insert("insert into tb_books values('4','Qt模块化笔记4','4')");bool ok1=query_insert.exec();if(ok1 && ok2){    transaction_COMMIT.exec("COMMIT");//提交}else{    transaction_ROLLBACK.exec("ROLLBACK");//回滚}


insert操作会进行两次,导致我们不想的结果出现,插入了两行相同的数据。


2,qt database类自带的三个函数:transaction(),commit(),rollback()可以省掉我们写一些sql语句的时间……

if(db.open()){        qDebug()<<"打开成功";        QSqlQuery query_insert;        QSqlQuery query_delete;        db.transaction();        bool ok1=query_insert.exec("insert into tb_books values('4','Qt模块化笔记4','4')");        bool ok2=query_delete.exec("delete from  tb_books where isbn='20131101183101' ");        qDebug()<<ok1<<ok2;        if(ok1 && ok2)        {            db.commit();        }else        {            db.rollback();        }}




原创粉丝点击