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(); }}
- Qt模块化笔记之sql——事务处理的实现
- Qt模块化笔记之sql——事务处理的实现
- Qt模块化笔记之sql——执行sql语句
- Qt模块化笔记之sql——前期准备
- Qt模块化笔记之sql——连接数据库
- Qt模块化笔记之sql——数据库模型视图
- Qt模块化笔记之multimedia——实时录音放音的另类实现
- Qt模块化笔记之core——QXmlStreamReader的使用
- Qt模块化笔记之Qt Widgets——日历类
- Qt模块化笔记之sql——数据库错误捕捉与处理
- Qt模块化笔记之network——第二个TCP程序,传输图片文件的实现(1)
- Qt模块化笔记之network——第二个TCP程序,传输图片文件的实现(2)
- Qt模块化笔记之network——第二个TCP程序,传输图片文件的实现(2)
- Qt模块化笔记之Qt_Quick——给Qt编写的安卓程序添加图标
- Qt模块化笔记之core——动画框架
- Qt模块化笔记之core——线程相关
- Qt模块化笔记之Qt_Quick——引入
- Qt模块化笔记之core——QXmlStreamWriter写XML
- sqlserver 连接远程主机及导入数据
- 流对象基本规律
- Apache "No services installed"问题的处理
- 【LeetCode】Longest Consecutive Sequence
- CString与std::string转换
- Qt模块化笔记之sql——事务处理的实现
- DM8168 OpenMax_VFPC模块应用
- 使用 GDB 调试多进程程序
- MyEclipse8.5 中配置Android开发环境
- (使用STL自带的排序功能进行排序7.3.12)UVA 11057 Exact Sum(在一组数据中找到这么两个数,使得他们的和等于指定数&&且这两个数之间的差值最小)
- MySql Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 解决方法
- 忙死我了
- Ubuntu获得超级用户权限
- Experiences in pentesting DWR