什么是事务(transaction)
事务(Transaction)是并发控制的基本单位。所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。
一个事务是有下列属性的一个工作单元:
原子性(ATOMICITY):
一个事务要被完全的无二义性的做完或撤消。在任何操作出现一个错误的情况下,构成事务的所有操作的效果必须被撤消,数据应被回滚到以前的状态。
一致性(CONSISTENCY):
一个事务应该保护所有定义在数据上的不变的属性(例如完整性约束)。在完成了一个成功的事务时,数据应处于一致的状态。换句话说,一个事务应该把系统从一个一致-状态转换到另一个一致状态。举个例子,在关系数据库的情况下,一个一致的事务将保护定义在数据上的所有完整性约束。
隔离性(ISOLATION):
在同一个环境中可能有多个事务并发执行,而每个事务都应表现为独立执行。串行的执行一系列事务的效果应该同于并发的执行它们。这要求两件事:
在一个事务执行过程中,数据的中间的(可能不一致)状态不应该被暴露给所有的其他事务。
两个并发的事务应该不能操作同一项数据。数据库管理系统通常使用锁来实现这个特征。
持久性(DURABILITY):
一个被完成的事务的效果应该是持久的。
如何标识一个事务
在SQL Server中,通常事务是指以BEGIN TRAN开始,到ROLLBACK或一个相匹配的COMMIT之间的所有语句序列。ROLLBACK表示要撤消(Undo)该事务已做的一切操作,回退到事务开始的状态。COMMIT表示提交事务中的一切操作,使得对数据库的改变生效。
在SQL Server中,对事务的管理包含三个方面:
• 事务控制语句:它使程序员能指明把一系列操作(Transact - SQL命令)作为一个工作单位来处理。
• 锁机制(Locking):封锁正被一个事务修改的数据,防止其他用户访问到“不一致”的数据。
• 事务日志(Transaction Log):使事务具有可恢复性。
SQL Server的锁机制
所谓封锁,就是一个事务可向系统提出请求,对被操作的数据加锁(Lock)。其他事务必须等到此事务解锁(Unlock)之后才能访问该数据。从而,在多个用户并发访问数据库时,确保不互相干扰(隔离性)。可锁定的单位是:行、页、表、盘区和数据库。
1. 锁的类型
SQL Server支持三种基本的封锁类型:共享(S)锁,排它(X)锁和更新(U)锁。封锁的基本粒度为行。
1) 共享(S)锁:用于读操作。
• 多个事务可封锁一个共享单位的数据。
• 任何事务都不能修改加S锁的数据。
• 通常是加S锁的数据被读取完毕,S锁立即被释放。
2) 独占(X)锁:用于写操作。
• 仅允许一个事务封锁此共享数据。
• 其他任何事务必须等到X锁被释放才能对该数据进行访问。
• X锁一直到事务结束才能被释放。
3) 更新(U)锁。
• 用来预定要对此页施加X锁,它允许其他事务读,但不允许再施加U锁或X锁。
• 当被读取数据页将要被更新时,则升级为X锁。
• U锁一直到事务结束时才能被释放。
2. 三种锁的相容性
如下表简单描述了三种锁的相容性:
通常,读操作(SELECT)获得共享锁,写操作(INSERT、DELETE)获得独占锁;而更新操作可分解为一个有更新意图的读和一个写操作,故先获得更新锁,然后再升级为独占锁。
执行的命令 获得锁 其他进程可以查询? 其他进程可以修改?
Select title_id from titles S Yes No
delete titles where price>25 X No No
insert titles values( ...) X No No
update titles set type=“general” U Yes No
where type=“business” 然后 X No No
使用索引降低锁并发性
我们为什么要讨论锁机制?如果用户操作数据时尽可能锁定最少的数据,这样处理过程,就不会等待被锁住的数据解锁,从而可以潜在地提高SQL Server的性能。如果有200个用户打算修改不同顾客的数据,仅对存储单个顾客信息的单一行进行加锁要比锁住整个表好得多。那么,用户如何只锁定行而不是表呢?当然是使用索引了。正如前面所提到的,对存有要修改数据的字段使用索引可以提高性能,因为索引能直接找到数据所在的页面,而不是搜索所有的数据页面去找到所需的行。如果用户直接找到表中对应的行并进行更新操作,只需锁定该行即可,而不是锁定多个页面或者整个表。性能的提高不仅仅是因为在修改时读取的页面较少,而且锁定较少的页面潜在地避免了一个用户在修改数据完成之前其他用户一直等待解锁的情况。
体验SQL语言的事务机制
作为大型的企业级数据库,SQL Server2000对事务提供了很好的支持。我们可以使用SQL语句来定义、提交以及回滚一个事务。
如下所示的SQL代码定义了一个事务,并且命名为"MyTransaction":
DECLARE @TranName VARCHAR(20)
SELECT @TranName = ’MyTransaction’
BEGIN TRANSACTION @TranName
GO
USE pubs
GO
UPDATE roysched
SET royalty = royalty * 1.10
WHERE title_id LIKE ’PC%’
GO
COMMIT TRANSACTION MyTransaction
GO
这里用到了SQL Server2000自带的示例数据库pubs,提交事务后,将为所有畅销计算机书籍支付的版税增加 10%。
打开SQL Server2000的查询分析器,选择pubs数据库,然后运行这段程序,结果显而易见。
可是如何在C#程序中运行呢?我们记得在普通的SQL查询中,一般需要把查询语句赋值给SalCommand.CommandText属性,这里也就像普通的SQL查询语句一样,将这些语句赋给SqlCommand.CommandText属性即可。要注意的一点是,其中的"GO"语句标志着SQL批处理的结束,编写SQL脚本是需要的,但是在这里是不必要的。我们可以编写如下的程序来验证这个想法:
//TranSql.csusing System;
using System.Data;
using System.Data.SqlClient;
namespace Aspcn
{
public class DbTranSql
{
file://将事务放到SQL Server中执行
public void DoTran()
{
file://建立连接并打开
SqlConnection myConn=GetConn();myConn.Open();
SqlCommand myComm=new SqlCommand();
try
{
myComm.Connection=myConn;
myComm.CommandText="DECLARE @TranName VARCHAR(20) ";
myComm.CommandText+="SELECT @TranName = ’MyTransaction’ ";
myComm.CommandText+="BEGIN TRANSACTION @TranName ";
myComm.CommandText+="USE pubs ";
myComm.CommandText+="UPDATE roysched SET royalty = royalty * 1.10 WHERE title_id LIKE ’Pc%’ ";
myComm.CommandText+="COMMIT TRANSACTION MyTransaction ";
myComm.ExecuteNonQuery();
}
catch(Exception err)
{
throw new ApplicationException("事务操作出错,系统信息:"+err.Message);
}
finally
{
myConn.Close();
}
}
file://获取数据连接
private SqlConnection GetConn()
{
string strSql="Data Source=localhost;Integrated Security=SSPI;user id=sa;password=";
SqlConnection myConn=new SqlConnection(strSql);
return myConn;
}
}
public class Test
{
public static void Main()
{
DbTranSql tranTest=new DbTranSql();
tranTest.DoTran();
Console.WriteLine("事务处理已经成功完成。");
Console.ReadLine();
}
}
}
注意到其中的SqlCommand对象myComm,它的CommandText属性仅仅是前面SQL代码字符串连接起来即可,当然,其中的"GO"语句已经全部去掉了。这个语句就像普通的查询一样,程序将SQL文本事实上提交给DBMS去处理了,然后接收返回的结果(如果有结果返回的话)。
很自然,我们最后看到了输出"事务处理已经成功完成",再用企业管理器查看pubs数据库的roysched表,所有title_id字段以"PC"开头的书籍的royalty字段的值都增加了0.1倍。
这里,我们并没有使用ADO.net的事务处理机制,而是简单地将执行事务的SQL语句当作普通的查询来执行,因此,事实上该事务完全没有用到.net的相关特性。
分享到:
相关推荐
CHI协议,transaction事务汇总: 1.部分事务分为ptl/full ,这里不做区分。 2.事务名基本可以“望文生义”,也就是我们代码所推荐的“命名即注释”。 3.部分事务的行为并不完全确定,个人推测。 4.针对request type...
- 事务管理器(Transaction Manager):在Spring Boot中,如果检测到JPA或Hibernate,将会自动配置一个`PlatformTransactionManager`实例。 2. **JPA集成** - JPA是Java提供的ORM(Object-Relational Mapping)...
### Spring中的Transaction事务传播行为种类详解 #### 一、引言 在开发基于Spring框架的应用程序时,事务管理是确保数据一致性的重要手段之一。Spring框架提供了丰富的事务管理功能,其中包括了事务传播行为...
在这个名为"TCC-Transaction分布式事务DEMO"的项目中,我们将深入探讨TCC模式以及如何在基于Mysql数据库的环境中实现它。 **TCC模式详解** TCC(Try-Confirm-Cancel)是一种补偿型的分布式事务处理模式,主要由三...
根据提供的文件信息,可以提炼出以下与“Principles of transaction processing”相关的知识点: 1. 事务处理的原理 事务处理系统是计算机系统的一个重要组成部分,它涉及到如何高效、安全地处理各种事务。事务处理...
【javax.transaction.jar】是Java平台上的一个核心组件,主要用于处理分布式环境中的事务管理。这个库包含了一组接口和类,这些接口和类定义了事务管理的API,使得开发者能够在Java应用程序中实现事务处理的规范。在...
本项目"基于Hyperf的TCC分布式事务-tcc-transaction.zip"提供了在Hyperf框架下实现TCC事务的示例,帮助开发者理解和应用TCC模式。 首先,我们需要了解Hyperf。Hyperf是一款基于Swoole 4.4+开发的高性能、全异步的...
根据给定的信息,本文将详细解析“transaction事务”这一核心概念及其在数据库操作中的应用,特别是结合提供的代码示例来探讨事务处理的具体实现方法。 ### 一、事务(Transaction)的基本概念 事务是数据库中一系列...
在实际项目中,`springtransaction`工程可能是包含了一个完整的示例,用于演示如何在MyEclipse环境中配置和使用Spring的事务管理功能。开发者可以通过导入此工程,学习和实践Spring事务管理的配置与使用,从而更好地...
1. **开启事务**:使用`BEGIN TRANSACTION`语句开启一个事务。这标志着事务的开始,所有的SQL操作将在同一个事务中执行,直到事务被提交或回滚。 ```sql begin transaction ``` 2. **执行SQL操作**:在开启事务后...
在RESTful架构中,事务(Transaction)是处理客户端与服务器之间数据交换的重要概念。本文将深入探讨RESTful服务中的事务处理,并以《Restlet实战(二十六)事务 (Transaction)》为例进行解析。 首先,我们要理解...
SQLite 事务(Transaction) 事务(Transaction)是一个对数据库执行工作单元。事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成。 事务...
本文将深入探讨“C#中调用Transaction”的相关知识点,包括事务的基本概念、事务的特性、如何在C#代码中创建和管理事务,以及与数据库交互时事务的应用。 ### 1. 事务基本概念 事务是数据库操作的一组逻辑单元,它...
在IT行业中,事务(Transaction)是数据库操作的核心概念,它确保了数据的一致性和完整性。在分布式系统和多用户环境中,事务处理对于防止数据错误和保持数据一致性至关重要。本篇文章将深入探讨“Transaction”这一...
3. 事务管理器(Transaction Manager):负责协调全局事务的整个生命周期,包括协调事务分支的提交或回滚,以及处理故障恢复。 4. 资源管理器(Resource Manager):负责管理对单一数据资源的访问,例如数据库、...
`Session`的内部维护了一个JDBC的`Connection`对象,而`Transaction`则管理着`Connection`上的事务状态。`SessionFactory`是`Session`的工厂,负责创建和配置`Session`。`SessionFactory`一般在应用启动时创建并缓存...
首先,我们要理解什么是分布式事务。在单体应用中,事务操作可以在同一数据库内完成,但在分布式系统中,由于多台服务器之间的交互,需要保证所有操作要么全部成功,要么全部失败,这就是分布式事务的核心目标——...
在 Oracle 数据库中,事务(Transaction)是数据库区别于文件系统的特性之一。它可以保证数据库的一致性和完整性。 事务的主要特征是 ACID,包括: 1. 原子性(Atomicity):事务中的所有动作要么都发生,要么都不...
- **事务管理器(Transaction Manager)**:作为事务服务的核心组件,事务管理器负责协调事务的开始、提交、回滚以及事务状态的监控。 - **资源管理器(Resource Manager)**:资源管理器负责具体的资源操作,例如数据库...