- 浏览: 65419 次
最新评论
-
fandayrockworld:
p.waitFor();avery_leo 写道Java代码 ...
Java调用Linux命令 -
673341766:
a.bat又是什么批处理, 兄弟能写清楚吗.
Java调用windows程序 -
673341766:
Process p1 = ru.exec("C ...
Java调用windows程序 -
avery_leo:
Java代码
public static double[] ...
Java调用Linux命令 -
xiaoxin5230:
想问一下高手,请问怎样获取发送邮件的大小啊!我用getSize ...
JAVAMAIL发送邮件
SQL SERVER事务处理
事务定义:
事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据更改均会
提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有
数据更改均被清除。
事务三种运行模式:
自动提交事务
每条单独的语句都是一个事务。
显式事务
每个事务均以
BEGIN TRANSACTION
语句显式开始,
以
COMMIT
或
ROLLBACK
语句显式结束。
隐性事务
在前一个事务完成时新事务隐式启动,但每个事务仍以
COMMIT
或
ROLLBACK
语句
显式完成。
事务操作的语法:
BEGIN TRANSACTION
BEGIN DISTRIBUTED TRANSACTION
COMMIT TRANSACTION
COMMIT WORK
ROLLBACK WORK
SAVE TRANSACTION
BEGIN TRANSACTION
BEGIN TRANSACTION
标记一个显式本地事务的起始点。
BEGIN TRANSACTION 将 @@TRANCOUNT 加 1 。
BEGIN TRANSACTION 代表一点,由连接引用的数据在该点是逻辑和物理上都一致的。如果遇上错误,在 BEGIN TRANSACTION 之后的所有数据改动都能进行回滚,以将数据返回到已知的一致状态 。每个事务继续执行直到它无误地完成并且用 COMMIT TRANSACTION 对数据库作永久的改动,或者遇上错误并且用 ROLLBACK TRANSACTION 语句擦除所有改动
语法
BEGIN TRAN [ SACTION ] [ transaction_name | @tran_name_variable [ WITH MARK [ 'description' ] ] ]
例子:
BEGIN TRAN T1
UPDATE table1 ...
--nest transaction M2
BEGIN TRAN M2 WITH MARK
UPDATE table2 ...
SELECT * from table1
COMMIT TRAN M2
UPDATE table3 ...
COMMIT TRAN T1
BEGIN DISTRIBUTED TRANSACTION
指定一个由
Microsoft
分布式事务处理协调器
(MS DTC)
管理的
Transact-SQL
分布式事务的起始。
语法
BEGIN DISTRIBUTED TRAN [ SACTION ]
[ transaction_name | @tran_name_variable ]
参数
transaction_name
是用户定义的事务名,用于跟踪
MS DTC
实用工具中的分布式事务。
transaction_name
必须符合标识符规则,但是仅使用头
32
个字符
@tran_name_variable
是用户定义的一个变量名,它含有一个事务名,该事务名用于跟踪
MS DTC
实用工具中的分布式事务。必须用
char
、
varchar
、
nchar
或
nvarchar
数据类型声明该变量。
注释
执行
BEGIN DISTRIBUTED TRANSACTION
语句的服务器是事务创建人,并且控制事务的完成
当连接发出后续
COMMIT TRANSACTION
或
ROLLBACK TRANSACTION
语句时,
主控服务器请求
MS DTC
在所涉及的服务器间管理分布式事务的完成。
有两个方法可将远程
SQL
服务器登记在一个分布式事务中:
分布式事务中已登记的连接执行一个远程存储过程调用,该调用引用一个远程服务器。
分布式事务中已登记的连接执行一个分布式查询,该查询引用一个远程服务器。
示例
本例在本地和远程数据库上更新作者的姓。本地和远程数据库将同时提交或同时回滚本事务。
说明
当前的
SQL Server
上必须安装
MS DTC.
USE pubs
GO
BEGIN DISTRIBUTED TRANSACTION
UPDATE authors
SET au_lname = 'McDonald' WHERE au_id = '409-56-7008'
EXECUTE
link_Server_T
.pubs.dbo.changeauth_lname '409-56-7008','McDonald'
COMMIT TRAN
GO
Note:
如果需要连接远程
DB,
如果是
linkServer
方式连接的话,一定要修该
linkServer
的
RPC
选项置为
True
。
SET XACT_ABORT
指定当
Transact-SQL
语句产生运行时错误时,
Microsoft? SQL Server?
是否自动回滚当前事务。
( 可以比较简单的理解,如果中间有任何一句 SQL 出错,所有 SQL 全部回滚 . 特别适用于 Procedure 中间调用 Procedure ,如果第一个 Procedure Ok ,被调用的 Procedure 中间有错误,如果 SET XACT_ABORT=false ,则出错的部分回滚,其他部分提交,当然外部 Procedure 也提交。) .
--- 在分布式 Trans 中一定要注意设置下面参数 (XACT_ABORT)
语法 SET XACT_ABORT { ON | OFF }
注释 当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。
对于大多数 OLE DB 提供程序(包括 SQL Server ),隐性或显式事务中的数据修改语句必须将 XACT_ABORT 设置为 ON 。
SET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置。
示例
下例导致在含有其它
Transact-SQL
语句的事务中发生违反外键错误。在第一个语句集中产生错误,但其它语句均成功执行且事务成功
提交。在第二个语句集中,
SET XACT_ABORT
设置为
ON
。这导致语句错误使批处理终止,并使事务回滚。
CREATE TABLE t1 (a int PRIMARY KEY)
CREATE TABLE t2 (a int REFERENCES t1(a))
GO
INSERT INTO t1 VALUES (1)
INSERT INTO t1 VALUES (3)
INSERT INTO t1 VALUES (4)
INSERT INTO t1 VALUES (6)
GO
SET XACT_ABORT OFF
GO
BEGIN TRAN
INSERT INTO t2 VALUES (1)
INSERT INTO t2 VALUES (2) /* Foreign key error */
INSERT INTO t2 VALUES (3)
COMMIT TRAN
GO
SET XACT_ABORT ON
GO
BEGIN TRAN
INSERT INTO t2 VALUES (4)
INSERT INTO t2 VALUES (5) /* Foreign key error */
INSERT INTO t2 VALUES (6)
COMMIT TRAN
GO
SAVE TRANSACTION
在事务内设置保存点。
语法
SAVE TRAN [ SACTION ] { savepoint_name | @savepoint_variable }
参数
savepoint_name
是指派给保存点的名称。保存点名称必须符合标识符规则,但只使用前
32
个字符。
@savepoint_variable
是用户定义的、含有有效保存点名称的变量的名称。
必须用
char
、
varchar
、
nchar
或
nvarchar
数据类型声明该变量。
注释
用户可以在事务内设置保存点或标记。保存点定义如果有条件地取消事务的一部分,事
务可以返回的位置。如果将事务回滚到保存点,则必须(如果需要,使用更多的
Transact-SQL
语句和
COMMIT TRANSACTION
语句)继续完成事务,或者必须(通过将事务回滚到其起始点)完全取消事务。若要取消整个事务,请使用
ROLLBACK TRANSACTION transaction_name
格式。这将撤消事务的所
有语句和过程。
Note : 1 : 在由 BEGIN DISTRIBUTED TRANSACTION 显式启动或从本地事务升级而来的分布式事务中,不支持 SAVE TRANSACTION 。
2 : 当事务开始时,将一直控制事务中所使用的资源直到事务完成(也就是锁定)。当将事务的一部分回滚到保存点时,将继续控制资源直到事务完成(或者回滚全部事务)。
例子:
begin transaction
save transaction A
insert into demo values('BB','B term')
rollback TRANSACTION A
create table demo2(name varchar(10),age int)
insert into demo2(name,age) values('lis',1)
commit transaction
ROLLBACK TRANSACTION
将显式事务或隐性事务回滚到事务的起点或事务内的某个保存点。
语法
ROLLBACK [ TRAN [ SACTION ]
[ transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable ] ]
参数
transaction_name
是给
BEGIN TRANSACTION
上的事务指派的名称。
transaction_name
必须符合标识符规则,但只使用事务名称的前
32
个字符。嵌套
事务时,
transaction_name
必须是来自最远的
BEGIN TRANSACTION
语句的名称。
@tran_name_variable
是用户定义的、含有有效事务名称的变量的名称。必须用
char
、
varchar
、
nchar
或
nvarchar
数据类型声明该变量。
savepoint_name
是来自
SAVE TRANSACTION
语句的
savepoint_name
。
savepoint_name
必须符合标识符规则。当条件回滚只影响事务的一部分时使
用
savepoint_name
。
@savepoint_variable
是用户定义的、含有有效保存点名称的变量的名称。必须用
char
、
varchar
、
nchar
或
nvarchar
数据类型声明该变量。
注释
ROLLBACK TRANSACTION
清除自事务的起点或到某个保存点所做的所有数据修改。
ROLLBACK
还释放由事务控制的资源。
不带
savepoint_name
和
transaction_name
的
ROLLBACK TRANSACTION
回滚到事务的起点。嵌套事务时,该语句将所有内层事务回滚到
最远的
BEGIN TRANSACTION
语句。在这两种情况下,
ROLLBACK TRANSACTION
均将
@@TRANCOUNT
系统函数减为
0
。
ROLLBACK
TRANSACTION savepoint_name
不减少
@@TRANCOUNT
。
Note:
ROLLBACK TRANSACTION
语句若指定
savepoint_name
则不释放任何锁。
在由
BEGIN DISTRIBUTED TRANSACTION
显式启动或从本地事务升级而来的分布式事务中,
ROLLBACK TRANSACTION
不能
引用
savepoint_name
。
在执行
COMMIT TRANSACTION
语句后不能回滚事务
。
在事务内允许有重复的保存点名称,但
ROLLBACK TRANSACTION
若使用重复的保存点名称,则只回滚到最近的使用该保存点名称的
SAVE TRANSACTION
。
在存储过程中,不带 savepoint_name 和 transaction_name 的 ROLLBACK TRANSACTION 语句将所有语句回滚到最远的 BEGINTRANSACTION 。在存储过程中, ROLLBACK TRANSACTION 语句使 @@TRANCOUNT 在触发器完成时的值不同于调用该存储过程时的 @@TRANCOUNT 值,并且生成一个信息。该信息不影响后面的处理。
如果在触发器中发出
ROLLBACK TRANSACTION
:将回滚对当前事务中的那一点所做的所有数据修改,包括触发器所做的修改。
触发器继续执行
ROLLBACK
语句之后的所有其余语句。如果这些语句中的任意语句修改数据,则不回滚这些修改。执行其余的语句不会激发嵌套触发器。在批处理中,不执行所有位于激发触发器的语句之后的语句。每次进入触发器,
@@TRANCOUNT
就增加
1
,即使在自动提交模式下也是如此。(系统将触发器视作隐性嵌套事务。)
在存储过程中,
ROLLBACK TRANSACTION
语句不影响调用该过程的批处理中的后续语句;
将执行批处理中的后续语句。在触发器中,
ROLLBACK TRANSACTION
语句终止含有激发触发器的语句的批处理;
不执行批处理中的后续语句。
ROLLBACK TRANSACTION 语句不生成显示给用户的信息。如果在存储过程或触发器中需要警告,请使用 RAISERROR 或 PRINT 语句。RAISERROR 是用于指出错误的首选语句。
ROLLBACK 对游标的影响由下面三个规则定义:
当 CURSOR_CLOSE_ON_COMMIT 设置为 ON 时,ROLLBACK 关闭但不释放所有打开的游标。
当 CURSOR_CLOSE_ON_COMMIT 设置为 OFF 时,ROLLBACK 不影响任何打开的同步 STATIC 或 INSENSITIVE 游标不影响已完全填充的异步 STATIC 游标。将关闭但不释放任何其它类型的打开的游标。
对于导致终止批处理并生成内部回滚的错误,将释放在含有该错误语句的批处理内声明的所有游标。
不论游标的类型或 CURSOR_CLOSE_ON_COMMIT 的设置,所有游标均将被释放,其中包括在该错误批处理所调用的存储过程内声明的游标。在该错误批处理之前的批处理内声明的游标以规则 1 和 2 为准。死锁错误就属于这类错误。在触发器中发出的 ROLLBACK 语句也 自动生成这类错误。
权限
ROLLBACK TRANSACTION 权限默认授予任何有效用户。
例子:
begin transaction
save transaction A
insert into demo values('BB','B term')
rollback TRANSACTION A
-- select * into demo2 from demo1
create table demo2(name varchar(10),age int)
insert into demo2(name,age) values('lis',1)
rollback transaction
COMMIT TRANSACTION
标志一个成功的隐性事务或用户定义事务的结束。如果
@@TRANCOUNT
为
1
,
COMMIT
TRANSACTION 使得自从事务开始以来所执行的 所有数据修改成为数据库的永久部分,释放连接
占用的资源,并将 @@TRANCOUNT 减少到 0 。如果 @@TRANCOUNT 大于 1 ,则 COMMIT
TRANSACTION 使 @@TRANCOUNT 按 1 递减。
只有当事务所引用的所有数据的逻辑都正确时,发出
COMMIT TRANSACTION
命令。
COMMIT WORK
标志事务的结束。
语法
COMMIT [ WORK ]
注释
此语句的功能与
COMMIT TRANSACTION
相同,但
COMMIT TRANSACTION
接受用户定义的事务
名称。这个指定或没有指定可选关键字 WORK 的 COMMIT 语法与 SQL-92 兼容
例子
:
begin transaction a
insert into demo values('BB','B term')
commit TRANSACTION A
隐性事务
当连接以隐性事务模式进行操作时,
SQL Server
将在提交或回滚当前事务后自动启动新事务。无须描述事务的开始,只需提交或
回滚每个事务。隐性事务模式生成连续的事务链。
在为连接将隐性事务模式设置为打开之后,当 SQL Server 首次执行下列任何语句时,都会自动启动一个事务:
|
ALTER TABLE |
INSERT |
|
CREATE |
OPEN |
|
DELETE |
REVOKE |
|
DROP |
SELECT |
|
FETCH |
TRUNCATE TABLE |
|
GRANT |
UPDATE |
在发出 COMMIT 或 ROLLBACK 语句之前,该事务将一直保持有效。在第一个事务被提交或回滚之后,下次当连接执行这些语句
中的任何语句时, SQL Server 都将自动启动一个新事务。 SQL Server 将不断地生成一个隐性事务链,
直到隐性事务模式关闭为止
例子:
begin transaction
save transaction A
insert into demo values('BB','B term')
rollback TRANSACTION A
create table demo2(name varchar(10),age int)
insert into demo2(name,age) values('lis',1)
rollback transaction
--
在
Create table demo2
时
SQL Server
已经隐式创建一个
Trans,
知道提交或回滚
嵌套事务处理 :
1 : Trans 嵌套,将内部的 trans 合并到外部并形成一个 Trans.
begin tran t1
----In the first trans .
Insert into demo2(name,age) values('lis',1)
---Second Trans
begin transaction t2
insert into demo values('BB','B term')
commit transaction t2
----In the first trans .
Insert into demo2(name,age) values('lis',2)
rollback transaction t1
Note:
在一系列嵌套的事务中用一个事务名给多个事务命名对该事务没有什么影响。系统仅登记第一个(最外部的)事务名。回滚
到其它任何名字(有效的保存点名除外)都会产生错误 。
事实上,任何在回滚之前执行的语句都没有在错误发生时回滚。这语句仅当外层的事务回滚时才会进行回滚。
例:内部事务回滚 SQL server 报错。
begin tran t1
Insert into demo2(name,age) values('lis',1)
---Second Trans
--Server: Msg 6401, Level 16, State 1, Line 6
---Cannot roll back t2. No transaction or savepoint of that name was found.
begin transaction t2
insert into demo values('BB','B term')
rollback
transaction t2
----In the first trans .
Insert into demo2(name,age) values('lis',2)
commit transaction t1
例: 内部事务提交 SQL server 不会报错。
begin tran t1
Insert into demo2(name,age) values('lis',1)
---Second Trans no error
begin transaction t2
insert into demo values('BB','B term')
commit
transaction t2
----In the first trans .
Insert into demo2(name,age) values('lis',2)
commit transaction t1
SQL Server 的隔离级别:
1: 设置 TimeOut 参数
Set Lock_TimeOut 5000
被锁超时 5 秒将自动解锁
Set Lock_TimeOut 0
产立即解锁,返回 Error 默认为 -1 ,无限等待
2 :
(SET TRANSACTION ISOLATION LEVEL
{ READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ | SERIALIZABLE
}
)
READ COMMITTED
指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或
幻像数据。该选项是 SQL Server 的默认值。
避免脏读,并在其他 session 在事务中不能对已有数据进行修改。共享锁。
READ UNCOMMITTED
执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数
据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据
集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中
限制最小的级别。
REPEATABLE READ
锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据
集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使
用该选项。
SERIALIZABLE
在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这
是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项
的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。
相关推荐
在SQL Server中,事务处理是数据库操作的核心组成部分,它确保数据的一致性和完整性。事务是一组逻辑操作,这些操作被视为单个单元,要么全部完成,要么全部回滚,以维护数据库的ACID(原子性、一致性、隔离性和持久...
在进行SQL Server事务处理程序设计时,首先需要了解其作用和重要性。事务处理主要用于需要保证多个数据操作同步执行的场景。例如,在一个进销存管理的案例中,涉及到进货单、商品进货明细、商品库存和应付款单四个表...
标题“Delphi_SQL Server事务处理编程技术.pdf”揭示了文档内容主要围绕Delphi开发环境与SQL Server数据库管理系统在事务处理方面的编程技术展开讨论。描述中提到的“数据库事务处理原理和技术”、“实例”、“深入...
在 Delphi 这样的集成开发环境中,与 SQL Server 数据库进行交互时,事务处理尤为重要。本篇将深入探讨 Delphi 配合 SQL Server 实现事务处理的相关知识点,并通过实例来演示如何在 Delphi 应用程序中运用。 首先,...
在SQL Server中,事务处理是确保数据库操作一致性、可靠性和完整性的核心机制。事务是由一系列数据库操作组成的单元,这些操作要么全部成功,要么全部失败。理解并熟练掌握SQL Server的事务处理对于数据库管理员和...
在数据库管理系统领域,Oracle和SQL Server是两大非常流行的大型数据库产品,它们在事务处理方面有各自的特点和差异。事务处理的机制直接关系到数据库系统的性能、并发控制以及数据的一致性和完整性。本文旨在比较...
在管理信息系统中,数据库事务处理是核心功能之一,尤其在使用较为广泛的Oracle和Microsoft SQL Server这两种关系型数据库管理系统中。本文旨在分析和比较这两种数据库在事务处理上的异同点。 事务是一系列数据库...
每个 SQL Server 数据库都有事务日志,用于记录所有事务以及每个事务所做的数据库修改。 你是否想读取和分析SQL Server日志文件 (.ldf) ?正找不到合适的软件呢?以上一款强大的sql数据库日志分析工具,可以轻松打开...
在SQL Server中,事务处理是数据库操作的核心组成部分,它确保了数据的一致性和完整性。本篇文章将深入探讨SQL Server的事务处理,特别是关于隔离级别的理解及其应用,以及锁的模式和作用。 首先,我们来看看SQL ...
该文档从sqlserver事务讲起,详述ACID,@@trancount,在嵌套事务中使用保存点,命名事务等
本篇将深入探讨SQL Server事务日志的原理,以及如何利用`fn_dblog`这个系统存储过程来查询和解析事务日志。 事务日志是SQL Server中的一个关键组成部分,它跟踪数据库中每个事务的所有更改。每次数据修改时,这些...
SQL SERVER事务处理的特点主要体现在其遵循ACID原则,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 **原子性** 原子性确保事务中的所有操作要么全部完成,要么...
3. 分布式事务:SQL Server 2000支持通过分布式事务处理(Distributed Transaction Coordinator, DTC)在多个数据库或者不同服务器之间进行协调的事务。这在跨数据库操作或者企业级应用中非常有用。 接下来,我们...
在C#中实现SQL Server事务处理是数据库操作中确保数据一致性的重要手段。事务是一组数据库操作,这些操作要么全部成功,要么全部失败,这保证了数据的完整性和一致性。以下是一个详细的C#实现SQL Server事务处理的...
首先,让我们了解SQL Server事务的基本概念。事务是数据库操作的逻辑单位,它包含一组必须一起成功或一起失败的操作。事务有四个特性,通常称为ACID属性:原子性(Atomicity)、一致性(Consistency)、隔离性...
在SQL Server中,事务是确保数据一致性的重要机制,特别是在存储过程中。存储过程是一组预编译的SQL语句,可以在数据库中被多次调用,提高了效率并降低了网络流量。本篇将详细介绍如何在SQL Server存储过程中使用...
SQL Server的事务处理是...总结来说,SQL Server事务优化主要涉及事务的管理、隔离级别选择、锁的控制、数据量的减少以及避免不必要的资源占用。通过这些策略,可以提升数据库性能,减少并发问题,同时保持数据一致性。
在事务处理过程中,ACID(原子性、一致性、隔离性和持久性)属性的实现也离不开事务日志的支持。原子性保证事务作为一个整体执行,或者全部不执行;一致性确保事务结束后,数据库处于合法状态;隔离性防止并发事务间...
### SQL Server事务基本使用方法详解 #### 一、事务的概念及使用 事务(Transaction)是数据库操作中的一个重要概念,尤其在SQL Server中,它是保证数据完整性和一致性的重要机制。事务被视为一系列操作的集合,...
实验十 SQL SERVER事务设计(选做),内附有截图以及整个实验流程内容和SQL 语句