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

所谓事务处理,即将一些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();
        }


}




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值