事务的四个特性: 原子性,一致性,持久性,隔离性

原子性:

原子性:表示事务执行是作为原子,不可分割,整个语句要么执行,要么不执行
sqlserver中每一个单独的语句可以看做是包含在事务中
每一句本身具有原子性,要么执行,要么不执行,不会有中间状态

CREATE TABLE Student1
(
Id INT
CONSTRAINT chk_test
CHECK (Id = )
) INSERT INTO Student1
VALUES(),()

例如:上面例子的约束,执行插入3成功执行,但是插入4失败,这时候也会导致3插入失败

因为它们是一个语句,每一个语句具有原子性,要么都执行成功,要么都执行失败

当然这种原子比较小,用户可以自定义原子的大小:

则需要包含在事务中,来构成用户自定义的原子粒度

注意:默认事务中,即使出错了也不会整个事务进行回滚,而是失败的语句抛出异常,而正确的语句成功执行,这样会破坏事务的原子性,所以sqlserver给与了一些选项来保证事务的原子性

提供了两大类保证事务的原子性

1 通过设置 set xact_abort on 为on,来设置所有事务都作为一个原子处理

例如:

SET  XACT_ABORT ON
BEGIN TRANSACTION
INSERT INTO Student1
VALUES() INSERT INTO Student1
VALUES() COMMIT
GO
SELECT * FROM Student1 AS s

2 按照用户设置进行回滚

这种方式具有更高的灵活性,可以自定义在什么情况进行rollback,利用try catch和@@error进行判断都属于这种方式

BEGIN TRANSACTION

BEGIN TRY
INSERT INTO Student1(Id)
VALUES () INSERT INTO Student1(Id)
VALUES () COMMIT
END TRY
BEGIN CATCH
ROLLBACK
END CATCH

一致性: 即在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏

隔离性:事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据

sqlserver利用加锁和阻塞来保证不同事务之间不同等级的隔离性

一般情况,完全隔离是不现实的,完全的隔离要求数据库同一时间只执行一条事务,这是不现实的

所以事务之间的互相影响分为:脏读,不可重复读,幻读

脏读:一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的

隔离等级:

Read Uncommited(最高的性能,但可能出现脏读,不可重复读,幻读)

Read commited(可能出现不可重复读,幻读)(满足99%的需求)

Repeatable Read(可能出现幻读)

Serializable(最低的性能,Range锁会导致并发下降)

SNOPSHOT(这个是通过在tempDB中创建一个额外的副本来避免脏读,不可重复读,会给tempDB造成额外负担)

总之:不同的隔离级别是通过添加不同的锁,造成阻塞来实现的

设置隔离级别:

隔离等级:

Read Uncommited(最高的性能,但可能出现脏读,不可重复读,幻读)

Read commited(可能出现不可重复读,幻读)(满足99%的需求)

Repeatable Read(可能出现幻读)

Serializable(最低的性能,Range锁会导致并发下降)

SNOPSHOT(这个是通过在tempDB中创建一个额外的副本来避免脏读,不可重复读,会给tempDB造成额外负担)

总之:不同的隔离级别是通过添加不同的锁,造成阻塞来实现的

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SELECT * from student1

持久性: 意味着事务完成后,该事务对数据库所做的更改便持久的保存在数据库之中

格式:

BEGIN TRY

BEGIN TRANSACTION
COMMIT TRANSACTION END TRY
BEGIN CATCH
IF @@TRANCOUNT > or xact_state() <>
ROLLBACK TRANSACTION ; SELECT ;
END CATCH

@'在SqlServer里,嵌套事务的层次是由@@TranCount全局变量反映出来的。
每一次Begin Transaction都会引起@@TranCount加1。
而每一次Commit Transaction都会使@@TranCount减1,
而RollBack Transaction会回滚所有的嵌套事务包括已经提交的事务和未提交的事务,
而使@@TranCount置0'

sqlserver关于事务的更多相关文章

  1. (转)对SQLSERVER数据库事务日志的疑问

    本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/06/10/3130856.html 对SQLSERVER数据库事务日志的疑问 摸不透SQLS ...

  2. SQLSERVER备份事务日志的作用

    事务日志备份有以下3种类型 (1)纯日志备份:仅包含相隔一段时间的事务日志记录,而不包含任何大容量更改 (2)大容量操作日志备份.包括由大容量操作更改的日志和数据页,不支持时间点恢复 (3)尾日志备份 ...

  3. SQLSERVER分布式事务使用实例

    实例一 尊重原著作:本文参考自http://www.jb51.net/article/43540.htm --BEGIN DISTRIBUTED TRANSACTION [transactionnam ...

  4. sQLserver T-SQL 事务的用法

    原文在: https://www.lesg.cn/netdaima/2016-55.html 在使用Mssql的时候经常需要用到存储过程 有些操作在前面发生错误的时候:需要回滚:这就需要事务了: 下面 ...

  5. SqlServer 查看事务锁及执行语句

    一.查看当前锁定的事务 ,) ,用户机器名称,) ,是否被锁住),blocked) ,数据库名称,),cmd 命令,waittype as 等待类型 ,last_batch 最后批处理时间,open_ ...

  6. sqlserver 2000事务复制问题

    2000现在用的估计不多了,把之前收集的一些复制问题整理发布出来.可能都是些很白很二的问题,但人总是由最初的无知不断成长,不对之处欢迎指正. sqlserver 2000事务复制问题服务器A(发布) ...

  7. SQLServer 延迟事务持久性

    SQL Server 2014新功能 -- 延迟事务持久性(Delayed Transaction Durability) SQL Server事务提交默认是完全持久性的(Full Durable), ...

  8. SQLServer之事务简介

    事务定义 事务是单个的工作单元.事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序自动执行. 事务分类 自动提交事务 每条单独的语句都是一个事务. 在自动提 ...

  9. SQLServer数据事务日志操作

    日志备份 (log backup) 包括以前日志备份中未备份的所有日志记录的事务日志备份. (完整恢复模式) 使用SSMS数据库管理工具备份事务日志 1.连接数据库,选择数据库->右键点击-&g ...

随机推荐

  1. .NET的Snk使用方法

    保护你Asp.Net生成的DLL和Code不被别人反编译  大家做项目开发一般都是分层的,比如UI层,业务层,数据访问层.业务层引用数据访问层的DLL(比如 dataAccess.dll),并使用da ...

  2. 常见MFC UI界面库

    Xtrme toolkit,BCGControlBar,SkinMagic,AppFace,Skin++,Uskin++,SYGUI,LibUIDK,GuiToolkit,GardenUI等等,除了后 ...

  3. C#多线程开发

    1.进程与线程的区别 通俗的讲,进行就是任务管理器中进行列表中看到的正在运行的程序,它是一个动态的概念,活动的实体. 线程是程序执行流的最小单元,是线程中一个实体,是系统独立调度和分派CPU基本单位. ...

  4. BZOJ 1043 HAOI2008 下落的圆盘 计算几何

    题目大意:n个圆盘依次下落.求终于能看到的轮廓线面积 円盘反对! 让我们一起团结起来! 赶走円盘! 咳咳.非常神的一道题 今天去看了题解和白书才搞出来-- 首先我们倒着做 对于每一个圆盘处理出在它之后 ...

  5. linux重启oracle 各种方法

    在linux下重启oracle数据库及监听器总结: 方法1: 用root以ssh登录到linux,打开终端输入以下命令: cd $ORACLE_HOME   #进入到oracle的安装目录 dbsta ...

  6. delphi 05 图片和超链接

    超链接 /取消超链接 插入/取消 书签 插入图片 粘贴图上CTRL+v 截图 插入表情GIF WEB背景色 WEB背景图片      WebBrowser1.OleObject.document.ge ...

  7. JAVA的StringBuffer类

    StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存 ...

  8. Android游戏开发之主角的移动与地图的平滑滚动

    人物移动地图的平滑滚动处理 玩过rpg游戏的朋友应该都知道RPG的游戏地图一般都比较大 今天我和大家分享一下在RPG游戏中如何来处理超出手机屏幕大小的游戏地图. 如图所示为程序效果动画图 地图滚动的原 ...

  9. Java基础:Collection—List&Set

    List和Set: List可以将元素维护在特定的序列中.它的特点是有序,允许重复元素出现.最常见的List的实现类是:ArrayList. Set的特点是:无序,不保存重复元素.当尝试将重复的元素添 ...

  10. 调用AutoCAD的内置对话框

    如何将CAD的内置对话框(如style命令所用的文字样式对话框)作为当前对话框的子对话框调出? 常用的几个对话框对应的函数为:1.尺寸标注样式编辑对话框:int acedEditDimstyleInt ...