随着互联网的发展和计算机技术的不断升级,数据库已经成为了数据存储和管理的核心工具。在数据库的应用中,事务处理是非常重要的一个环节。事务是指基于数据库之上的一系列操作,它要么全部被执行,要么全部不被执行,这个过程称为事务。本文将,包括事务的定义、特点和分类等内容。
一、事务的定义
数据库事务是具有原子性、一致性、隔离性和持久性等特性的一组操作,被视为一个单元进行执行。

1. 原子性
事务是原子性的,意味着事务中的所有操作,要么全部执行成功,要么全部执行失败。即使其中一项操作失败,整个事务也会被视为失败,所有的操作会被回退。
2. 一致性
事务执行结束后,系统应该保证数据的一致性。这意味着事务在执行过程中,数据可以被多次修改,但最终数据的状态必须是符合一定规则的。
3. 隔离性
事务之间应该是相互隔离的,一个事务的执行不应该影响到其他事务的执行结果。这可以保证事务的并发性和安全性。
4. 持久性
事务在提交之后,对数据的修改应该被持久化保存到数据库中,并且不可被回滚。这可以保证事务的结果不会被意外地破坏。
二、事务的特点
对于事务,有以下几个特点:
1. 原子性
事务具有原子性,意味着它可以被看成一个不可分割的整体。
2. 一致性
事务执行的结果必须是符合一定规则的,否则事务将会被回滚。
3. 隔离性
事务之间应该是相互隔离的,以保证并发执行的正确性和安全性。
4. 持久性
事务一旦提交,数据修改的效果应该被持久化保存在数据库中。
三、事务的分类
根据Oracle官方数据库指南,事务可以分为以下几种类型:
1. 用户事务
通常是由用户直接触发的事务,涉及对单个或多个表的操作。
2. 系统事务
由数据库引擎自行触发的事务,如空间管理、资源管理等。
3. 隐含事务
在DML(Data Manipulation Language,数据操作语言)语句执行时引发的隐含事务,例如INSERT、DELETE、UPDATE等等。
4. 显式事务
由应用程序显式地定义和执行的事务,例如BEGIN、COMMIT和ROLLBACK语句等等。
5. 本地事务
在一个数据库实例内执行的事务。
6. 全局事务
在多个数据库实例间执行的事务。
四、事务的应用
在实际应用中,数据库的事务处理是非常重要的。在银行、电商、等领域,数据的安全性和一致性是至关重要的。对于企业级应用来说,事务处理的数据量和并发性非常高,因此如何优化事务处理的效率和可靠性,具有极大的意义。
1. 提高事务处理能力
使用合适的数据库引擎,提高事务处理效率和可靠性,是企业级应用所必须具备的能力。
2. 提高事务处理并发性
通过并发控制机制,克服多个事务之间的相互干扰,提高了事务处理的并发性和安全性。
3. 降低数据异常风险
通过正确处理事务分离、隔离等问题,得到了更好的数据保障,降低了数据异常风险。
数据库事务是数据管理的重要环节,具有原子性、一致性、隔离性和持久性等特点,对于企业级应用具有至关重要的作用。对于事务的理解和应用,在数据库的设计和优化中起到了重要作用。
相关问题拓展阅读:
数据库故障分为哪几种类型?
数据库运行过程中常见的故障有3类:事物故障、系统故障、介质故障。
恢复策略:
1、事物故障:
发生事务故障时,被迫中断的事务可能已对数据库进行丁修改,为了消除该事务对数据库的影响,要利用日志文件中所记载的信息,强行回滚该事务,将数据库恢复到修改前的初始状态。
为此,要检查日志文件中由这些事务所引起的发生变化的记录,取消这些没有完成的事务所做的一切改变,这类恢复操作称为事务撤销。
2、系统故障:
系统故障的恢复要完成两方面的工作,既要撤销所有末完成的事务,还要重做所有已提交的事务,这样才能将数据库真正恢复到一致的状态。
3、介质故障:
介质故障比事务故障和系统故障发生的可能性要小,但这是最严重的一种故障,破坏性很大,磁盘上的物理数据和日志文件可能被破坏,这需要装入发生介肢纯质故障前最新的后备数据库副本,然后利用日志文件重做该副本后所运行的所有事务。
扩展资料:
“数据故障恢复”和“完整性约束”、“并发控制”一样,都是数据库数据保护机制中的一种完整性控制。所有的系统都免不了会发生故障,有可能是硬件失灵,有可能是软件系统崩溃,也有可能是其他外界的原因,比如断电等等。
数据库运行的突然中断会使数据库处在一个错误的状态局饥雀,而且故障排除后没有办法让系统精确地从断点继续执行下去。这就要求DBMS要有一套故障后的数据恢复机构,保证数桐早据库能够回复到一致的、正确地状态去。
百度百科-事务故障
百度百科-系统故障
百度百科-介质故障
在.NET中使用Oracle数据库事务
在本文中 您将了解到如何在 Visual Basic NET (VB NET) 和 Visual C# NET (C#) 中使用数据库事务 具体来讲 您将系统学习数据库事务 在 NET 程序中使用 OracleTransaction 对象以及如何设置事务保存点 本文中引用的所有脚本和文件都在这里提供 本文假定您大体上熟悉 C# 和 VB NET 编程
所需软件
如果您要跟随我们逐步完成本文中给出的示例 那么您需要安装以下软件
windows NT Windows Windows XP Professional 或 Windows Server
能够访问一个已安装的 Oracle 数据库(Oracle i 版本 或更高版本)
Oracle 客户机(版本 或更高版本)
Oracle Net(版本 或更高版本)
Oracle>服务器
注意 ODP NET 驱动程序针对 Oracle 数据库访问进行了优化 因此可以获得更佳性能 并且它们还支持 Oracle 数据库的丰富特性 如 BFILE BLOB CLOB XMLType 等 如果您正在开发基于 Oracle 数据库的 NET 应用程序 那么就特性和性能来讲搭芦 ODP NET 无疑是更佳的选择
数据库模式设置
首先 您需要设置数据库模式 在此我们使用一个简化的 Web 商店示例 您必须首先创建一个名为 store 的用户并按以下方式将所需的权限授予该用户(您必须首先以拥有 CREATE USER 权限的用户身份登录数据库才能创建用户)
CREATE USER store IDENTIFIED BY store;GRANT connect resource TO store;
注意 您会在源代码文件 db sql 中找到前两个语句和该部分中出现的设置 store 模式的其他语句
接下的语句以 store 用户身份进行连接
CONNECT store/store;
以下语句创建了所需的两个数据库表 名称分别为 product_types 和 products
CREATE TABLE product_types (product_type_id INTEGERCONSTRAINT product_types_pk PRIMARY keyname VARCHAR ( ) NOT NULL);
CREATE TABLE products (product_id INTEGERCONSTRAINT products_pk PRIMARY KEYproduct_type_id INTEGERCONSTRAINT products_fk_product_typesREFERENCES product_types(product_type_id)name VARCHAR ( ) NOT NULLdescription VARCHAR ( )price NUMBER( ));
注意 如果您在一个知正带不同的模式中为 store 用户创建了这些数据库表 那么您将需要修改示例配置文件(您稍后将看到)中的模式名称
表 product_types 用于存储示例在线商店可能库存的产品类型的名称 表 products 包含了所销售产品的详细信息
下面的 INSERT 语句为表 product_types 和 products 添加行
INSERT INTO product_types (product_type_id name) VALUES (Book);INSERT INTO product_types (product_type_id name) VALUES (DVD);
INSERT INTO products (product_id product_type_id name description price) VALUES (Modern Science A description of modern science);INSERT INTO products (product_id product_type_id name description price) VALUES (Chemistry Introduction to Chemistry);INSERT INTO products (product_id product_type_id name description price) VALUES (Supernova A star explodes);INSERT INTO products (product_id product_type_id name description price) VALUES (Tank War Action movie about a future war);
接下来 您将了解有关数据库事务的内容
数据库事务简介
数据库事务是由一组 SQL 语句组成的一个逻辑工作单元 您可以把事务看作是一组不可分的 SQL 语句 这些语句作为一个整体永久记录在数据库中或一并撤销 比如在银行帐户之间转移资金 一条 UPDATE 语句将从一个帐户的资金总数中减去一部分 另一条 UPDATE 语句将把资金加到另一个帐户中 减操作和加操作必须永久记录在数据库中 或者必须一并撤销 ― 否则将损失资金 这个简单的示例仅使用了两条 UPDATE 语句 但一个更实际的事务可能包含许多 INSERT UPDATE 和 DELETE 语句
要永久记录一个事务中的 SQL 语句的结果 您可以通过 MIT 语句来执行提交 要撤销 SQL 语句的结果 您可以使用 ROLLBACK 语句来执行回滚 这会把所有的行重设为它们原来的状态 只要您事先没有与数据库断开 则您在执行回滚之前所做的任何修改都将被撤销 您还可以设置一个保存点 以便将事务回滚至该特定的点 同时保持事务中的其他语句原封不动
在 C# 和 VB NET 中使用数据库事务
您可以使用 OracleTransaction 类的一个对象来表示一个事务 OracleTransaction 类包含多个属性 其中的两个为 Connection(指定与事务关联的数据库连接)和 IsolationLevel(指定事务隔离级别) 本文稍后将向您介绍更多有关事务隔离级别的内容
OracleTransaction 类包含许多操控事务的方法 您可以使用 Commit() 方法永久提交 SQL 语句 并可以使用 Rollback() 撤销这些语句 您还可以使用 Save() 在事务中设置一个保存点
我现在将带着您逐步完成两个示例程序 ― 一个用 C# 编写 (TransExample cs) 另一个用 VB NET 编写 (TransExample vb) 这些程序演示了如何执行一个包含了两条 INSERT 语句的事务 之一条 INSERT 语句将在表 product_types 中添加一行 第二条将在表 products 中添加一行
导入命名空间
以下 C# 程序语句指定在程序中使用 System 和 Oracle>香港服务器首选树叶云,2H2G首月10元开通。树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
deadlocks(死锁)是什么?
在两个或多个任务中,如果每个任务锁定了其他任务试图锁定的资源,此时会造成这些任务永久阻塞,从而出现死锁。 例如:事务 A 获取了行 1 的共享锁。 事务 B 获取了行 2 的共享锁。 现在,事务 A 请求行 2 的排他锁,但在事务 B 完成并释放其对行 2 持有的共享锁之前被阻塞。 现在,事务 B 请求行 1 的排他锁,但在事务 A 完成并释放其对行 1 持有的共享锁之前被阻塞。 事务 A 必须在事务 B 完成之后才能完成,但事务 B 被事务 A 阻塞。 这种情况也称为循环依赖关系:事务 A 依赖于事务 B,而事务 B 又依赖于事务 A,从而形成了一个循环。 除非某个外部进程断开死锁,否则死锁中的两个事务都将无限期等待下去。 Microsoft SQL Server Database Engine 死锁监视器定期检查陷入死锁的任务。 如果监视器检测到循环依赖关系,将选择其中一个任务作为牺牲品,然后终止其事务并提示错误。 这样,其他任务就可以完成其事务。 对于事务以错误终止的应用程序,它还可以重试该事务,但通常要等到与它一起陷入死锁的其他事务完成后执行。 在应用程序中使用特定编码约定可以减少应用程序导致死锁的机会。 有关详细信息,请参阅将死锁减至最少。 死锁经常与正常阻塞混淆。 事务请求被其他事务锁定的资源的锁时,发出请求的事务一直等到该锁被释放。 默认情况下,SQL Server 事务不会超时(除非设置了 LOCK_TIMEOUT)。 因为发出请求的事务未执行任何操作来阻塞拥有锁的事务,所以该事务是被阻塞,而不是陷入了死锁。 最后,拥有锁的事务将完成并释放锁,然后发出请求底事务将获取锁并继续执行。 死锁有时称为抱死。 不只是关系数据库管理系统,任何多线程系统上都会发生死锁,并且对于数据库对象的锁之外的资源也会发生死锁。 例如,多线程操作系统中的一个线程要获取一个或多个资源(例如,内存块)。 如果要获取的资源当前为另一线程所拥有,则第一个线程可能必须等待拥有线程释放目标资源。 这就是说,对于该特定资源,等待线程依赖于拥有线程。 在数据库引擎 实例中,当获取非数据库资源(例如,内存或线程)时,会话会死锁。 在上图中,对于 Part 表锁资源,事务 T1 依赖于事务 T2。 同样,对于 Supplier 表锁资源,事务 T2 依赖于事务 T1。 因为这些依赖关系形成了一个循环,所以在事务 T1 和事务 T2 之间存在死锁。
活锁和死锁是怎么回事?
一、活锁如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。 T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。 然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求,...,T2有可能永远等待,这就是活锁的情形,如图8.4(a)所示。 避免活锁的简单方法是采用先来先服务的策略。 二、死锁如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放R2上的锁。 接着T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1释放R1上的锁。 这样就出现了T1在等待T2,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。 1. 死锁的预防在数据库中,产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求对已为其他事务封锁的数据对象加锁,从而出现死等待。 防止死锁的发生其实就是要破坏产生死锁的条件。 预防死锁通常有两种方法:① 一次封锁法一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。 一次封锁法虽然可以有效地防止死锁的发生,但也存在问题,一次就将以后要用到的全部数据加锁,势必扩大了封锁的范围,从而降低了系统的并发度。 ② 顺序封锁法顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。 顺序封锁法可以有效地防止死锁,但也同样存在问题。 事务的封锁请求可以随着事务的执行而动态地决定,很难事先确定每一个事务要封锁哪些对象,因此也就很难按规定的顺序去施加封锁。 可见,在操作系统中广为采用的预防死锁的策略并不很适合数据库的特点,因此DBMS在解决死锁的问题上普遍采用的是诊断并解除死锁的方法。 2. 死锁的诊断与解除① 超时法如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。 超时法实现简单,但其不足也很明显。 一是有可能误判死锁,事务因为其他原因使等待时间超过时限,系统会误认为发生了死锁。 二是时限若设置得太长,死锁发生后不能及时发现。 ② 等待图法事务等待图是一个有向图G=(T,U)。 T为结点的集合,每个结点表示正运行的事务;U为边的集合,每条边表示事务等待的情况。 若T1等待T2,则T1、T2之间划一条有向边,从T1指向T2。 事务等待图动态地反映了所有事务的等待情况。 并发控制子系统周期性地(比如每隔1分钟)检测事务等待图,如果发现图中存在回路,则表示系统中出现了死锁。 DBMS的并发控制子系统一旦检测到系统中存在死锁,就要设法解除。 通常采用的方法是选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有的锁,使其它事务得以继续运行下去。 当然,对撤消的事务所执行的数据修改操作必须加以恢复。
何谓基础埋置深度?选择基础埋置深度应考虑哪些因素的影响?
基础埋置深度 (embedment depth of foundation ) 一般是指基础底面到室外设计地面的距离,简称基础埋深。 地下室采用箱型基础或筏基时,基础埋置深度自室外地面标高算起。 采用独立基础或条形基础时,应从室内地面标高算起。 影响基础埋深选择的主要因素可以归纳为五个方面:1 、建筑物的用途,有无地下室、设备基础和地下设施,基础的形式和构造;2 、作用在地基上的荷载大小和性质;3 、工程地质和水文地质条件;4、 相邻建筑物的基础埋深;5、 地基土冻胀和融陷的影响。 扩展资料:在满足地基稳定和变形要求的前提下,地基宜浅埋,当上层地基的承载力大于下层土时,宜利用上层做持力层。 除岩石地基外,基础埋深不宜小于0.5m。 高层建筑筏形和箱形基础的埋置深度应满足地基承载力、变形和稳定性要求。 在抗震设防区,除岩石地基外,天然地基上的箱形和筏形基础其埋置深度不宜小于建筑物高度的1/15;桩箱或桩筏基础的埋置深度(不计桩长)不宜小于建筑物高度的1/18。 位于岩石地基上的高层建筑,其基础埋置深度应满足抗滑要求。 基础宜埋置在地下水位以上,当必须埋置在地下水位以下时,应采取地基土在施工时不受扰动的措施。 当基础埋置在易风化的岩层上,施工时应在基坑开挖后立即铺筑垫层。 当存在相邻建筑物时,新建建筑物的基础埋置深度不宜大于原有建筑基础。 当埋置大于原有建筑基础时,两基础间应保持一定净距,其数值应根据原有建筑荷载大小、基础形式和土质情况确定。 当上述要求不能满足时,应采取分段施工,设临时加固支撑,打板桩,地下连续墙等施工措施,或加固原有建筑物基础。 参考资料来源:网络百科-基础埋置深度
发表评论