数据库中的事物处理

 数据库

  数据库的更新通常都是由客观世界的所发生的事件引起的。为保证数据库内容的一致,就要将数据库的一组操作作为一个整体来进行,要么全部成功完成,要么全部失败退出。如果由于故障或其它原因而使一组操作中有一些完成,有一些未完成,则必然会使得数据库中的数据出现不一致,从而使得数据库的完整性受到破坏。因此,更新操作序列必须作为一个整体在DBMS执行时出现,即“要么全做,要么全不做”。SQL提供了事务处理的机制,来帮助DBMS实现上述的功能。

  事务处理

  事务处理(TRANSACTION)的每个语句是由一个或多个SQL语句序列结合在一起所形成的一个逻辑处理单元。事务处理中句都是完成整个任务的一部分工作,所有的语句组织在一起能够完成某一特定的任务。DBMS在对事务处理中的语句进行处理时,是按照下面的约定来进行的,这就是“事务处理中的所有语句被作为一个原子工作单位,所有的语句既可成功地被执行,也可以没有任何一个语句被执行”。DBMS负责完成这种约定,即使在事务处理中应用程序异常退出,或者是硬件出现故障等各种意外情况下,也是如此。在任何意外情况下,DBMS都负责确保在系统恢复正常后,数据库内容决不会出现“部分事务处理中的语句被执行完”的情况。

  sql语言

  sql语言为事务处理提供了两个重要的语句,它们是COMMIT和ROLLBACK语句。它们的使用格式是:

  COMMIT WORK

  ROLLBACK WORK

  COMMIT语句用于告诉DMBS,事务处理中的语句被成功执行完成了。被成功执行完成后,数据库内容将是完整的。而ROLLBACK语句则是用于告诉DBMS,事务处理中的语句不能被成功执行。这时候,DBMS将恢复本次事务处理期间对数据库所进行的修改,使之恢复到本次事务处理之前的状态。

  事务处理:


QSqlDatabase::database().transaction();

QSqlQuery query;

query.exec("SELECT id FROM employee WHERE name = 'Torild Halvorsen'");

if (query.next())

{

int employeeId = query.value(0).toInt();

query.exec("INSERT INTO project (id, name, ownerid) "

"VALUES (201, 'Manhattan Project', "

+ QString::number(employeeId) + ")");

}

QSqlDatabase::database().commit();

  如果数据库引擎支持事务处理,则函数QSqlDriver::hasFeature(QSqlDriver::Transactions)将返回 真。

  可以通过调用QSqlDatabase::transaction()来初始化一个事务处理。之后执行你想在该事务处理的工作。

  完了再执行QSqlDatabase::commit()来提交事务处理或QSqlDatabase::rollback()取消事务处理。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-31 02:14:42

数据库中的事物处理的相关文章

谈数据库中模糊数据的输入与判别

数据|数据库 前言 模糊数据库,是指能够处理模糊数据的数据库.一般的数据库都是以二直逻辑和精确的数据工具为基础的,不能表示许多模糊不清的事情.随着模糊数学理论体系的建立,人们可以用数量来描述模糊事件并能进行模糊运算.这样就可以把不完全性.不确定性.模糊性引入数据库系统中,从而形成模糊数据库.模糊数据库研究主要有两方面,首先是如何在数据库中存放模糊数据:其次是定义各种运算建立模糊数据上的函数.模糊数的表示主要有模糊区间数.模糊中心数.模糊集合数和隶属函数等. 自从1965年美国加州大学伯克利分校的

java web中的事物是什么?

问题描述 java web中的事物是什么? java web中好多关于事物的描述,比如说事物控制.事物提交回滚什么的,到底什么事事物? 解决方案 sql server事务全攻略 一 事务的属性 事务具有ACID属性 即 Atomic原子性, Consistent一致性, Isolated隔离性, Durable永久性 原子性 就是事务应作为一个工作单元,事务处理完成,所有的工作要么都在数据库中保存下来,要么完全 回滚,全部不保留 一致性 事务完成或者撤销后,都应该处于一致的状态 隔离性 多个事务

SQLite数据库中的SQL语句及使用

一.如何获取SQLite最新版本 官方站点:http://www.sqlite.org/ 从http://www.sqlite.org/网站的Download页面获取 二.Windows下的SQLite的源代码是哪个软件压缩包? sqlite-amalgamation-3_6_22.zip是SQLite的windows下源码文件 三.Window下的SQLite命令行工具 sqlite-3_6_22.zip 四.Window下的SQLite开发库,即动态链接库以及DEF文件 sqlitedll-

重新编译数据库中的失效对象

原文整理自:http://www.51testing.com/?uid-16403-action-viewspace-itemid-98161:http://www.eygle.com/archives/2005/01/ecioaeaoeeeaoea.html 先看个帖子:http://www.itpub.net/thread-1112553-1-1.html 每次数据库做了升级(打各种数据库方面的补丁后,不是数据库本身的升级,是各种对象改变增加修改等,呵呵不,别误解)完了以后我都要查一下数据库

深入分析MSSQL数据库中事务隔离级别和锁机制_MsSql

锁机制 NOLOCK和READPAST的区别. 1.       开启一个事务执行插入数据的操作. BEGIN TRAN t INSERT INTO Customer SELECT 'a','a' 2.       执行一条查询语句. SELECT * FROM Customer WITH (NOLOCK) 结果中显示"a"和"a".当1中事务回滚后,那么a将成为脏数据.(注:1中的事务未提交) .NOLOCK表明没有对数据表添加共享锁以阻止其它事务对数据表数据的修

SQLServer数据库中开启CDC导致事务日志空间被占满的原因

SQLServer中开启CDC之后,在某些情况下会导致事务日志空间被占满的现象为: 在执行增删改语句(产生事务日志)的过程中提示,The transaction log for database '***' is full due to 'REPLICATION'(数据库"***"的事务日志已满,原因为"REPLICATION"). CDC以及复制的基本原理粗略地讲,对于日志的使用步骤如下: 1,每当基础表(开启了CDC或者replication的表)产生事务性操作

深入分析MSSQL数据库中事务隔离级别和锁机制

锁机制 NOLOCK和READPAST的区别. 1.       开启一个事务执行插入数据的操作. BEGIN TRAN t INSERT INTO Customer SELECT 'a','a' 2.       执行一条查询语句. SELECT * FROM Customer WITH (NOLOCK) 结果中显示"a"和"a".当1中事务回滚后,那么a将成为脏数据.(注:1中的事务未提交) .NOLOCK表明没有对数据表添加共享锁以阻止其它事务对数据表数据的修

sqlite删除数据库中的数据时偶尔会出现错误

问题描述 sqlite删除数据库中的数据时偶尔会出现错误 java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed. 求助,connection pool 是啥啊,求大神指教. 解决方案 如果确定不是连接被关闭,那还有可能就是多线程访问sqlite,sqlite数据库是单线程操作的,那么当N多个Thread同时调用的时候,可能报这错误.这也就

哪位大神指导一下,关于Oracle数据库中类型varchar2(2) 存储汉字的问题

问题描述 哪位大神指导一下,关于Oracle数据库中类型varchar2(2) 存储汉字的问题 大神们跪求招数:orcale数据库中的一个字段YXQDW(有效期单位) 类型varchar2(2) 才两字节 用来存一个汉字,比如"年",我的项目(C#)一个汉字占用3个字节, 写SQL语句 insert不进去啊,提示字段范围超出了.难不成要像blob字段那样写?或者有什么更好的方式能将该字段插入呢?万分感激! 解决方案 可以换成nvarchar(2),这个是可变长度