事务是什么?事务关键在与其原子性。原子性概念是指可以把一些事情当作一个执行单元来看待。从数据库角度看待。他是指应该全部执行或者全部不执行一条或多条语句的最小组合。当处理数据时候经常确保一件事发生另一件事也随之发生。或者二件事都不发生。实际上可能达到程度是有几十件事情或者更多的事情都必须一起发生或者都不发生。来看一个一个经典事例。这个事例各大书籍讲事务都有。就是你去银行转帐给朋友。转了100元sql如下:你的帐号扣了100元,你朋友帐号加了100元。看起来很完美。其实有个BUG存在,你的帐号被扣100元后在执行你朋友帐号加100元时候,数据出现错误,没有添加进去。

ACID事务

如果你的系统被设计为使用ACID事务,则不会出现上面那种情况。ACID事务

1.原子性:事务会全部执行,要么全部不执行。

2.一致性:需要遵循所有约束以及其他数据库完整性规则,并且完全的更新所有相关的对象(数据和索引页)

3.隔离性:每一个事务与其他任何事务完全的隔离。一个事务动作不会受其它事务动作干扰。

4.持久性:完成事务后,它的作用结果永久保存在系统内部。数据是“安全的”。这是指不会在停电或者系统故障或设备故障不会导致数据写入一半的情况发生。

事务简单操作简介

你需要一种办法确保第一条SQL语句执行,第二条也跟着执行。实际上不存在这样一种可完全控制可能。从硬件故障到违反数据完整性规则简单事情。都有可能发生错误。然而幸运的是;有一种可能达到相同的目地方法-基本忘记从前发生什么事。至少可以强制这个概念:如果某件事没有发生,那什么不会发生,至少事务的作用范围内部就是这样。

如何标志标志是开始和结束,回滚

BEGIN TRAN : 设置为起点

COMMIT TRAN :让事务成为数据中心永久的,不可逆的一部分

ROLLBACK TRAN:不考虑所有更改,本质上想说忘记以前发生的一却

SAVE TRAN:创建一个特定标识符,只允许部分回滚

BEGIN TRAN 事务开始很好理解,它唯一目的就是表示一个执行单元开始。高级部分不讨论了,因为面向DBA的高级特性。

COMMIT TRAN  提交事务一个终点,当发出COMMIT TRAN命令时候,可以认为该事务是持久性

ROLLBACK TRAN 每当考虑ROLLBACK TRAN 时候表示。表示该执行单元有错误。或者回到起点重新开始。(忘记过去,重新开始)

SAVE TRAN 保存事务创建书签。创建书签在数据回滚时候,回滚到每个书签上。记住ROLLBACK在回滚会清除所有书签。如果保存了5个书签,一旦执行ROLLBACK,5个书签全部清空。

试一试事务:

我朋友在帮市公安局做数据维护,因为数据库不安全。经常被黑客攻击在一些标题加入跳转HTML代码。我朋友每隔一段时间就清除一下HTML代码,突然有一天我朋友sql写错了。替换之后有个表字段值被清空,马上使用备份,备份文件和现在文件相差一个月。因为服务器备份出错了。一个月没有备份不知道。最后通过省公安局备份数据还原那个字段的值。如果使用事务,发现不对,可以回滚。我们接着事务先看SQL语句和结果看事务有什么神奇之处。

USE panda --继续用这个数据库
GO SELECT * FROM dbo.test002
--结果集合
--4 122 22 xxx@qq.com 112
--6 122 22 x22xx@qq.com 31222
--12 231 3334 qxxfs@qq.com 18612345678 BEGIN TRAN
UPDATE dbo.test002 SET name='test' --本来修改ID 为12的数据。忘记写WHERE 过滤了 SELECT * FROM dbo.test002
--结果集合
--4 test 22 xxx@qq.com 112
--6 test 22 x22xx@qq.com 31222
--12 test 3334 qxxfs@qq.com 18612345678
--在查询一次 表示我误伤了所有数据。 那就进行回滚:
ROLLBACK TRAN
SELECT * FROM dbo.test002
--结果集合
--4 122 22 xxx@qq.com 112
--6 122 22 x22xx@qq.com 31222
--12 231 3334 qxxfs@qq.com 18612345678 数据正常了

如果多条语句呢?如下图

BEGIN TRAN
UPDATE dbo.test002 SET name='test'
begin TRAN
UPDATE dbo.test003 SET name='test' ROLLBACK TRAN --这条语句执行后,前面2条事务语句全部回滚。
COMMIT TRAN --数据会更新完毕。

数据脏读:我执行BEGIN TRAN UPDATE dbo.test002 SET name='test' ,有些人胆子大来获取数据,我在ROLLBACK STRN些,那他就倒霉了,这就脏读。。。

非重复读取:非重复度很容易跟脏读混淆。只知道这个术语就可以了。

幻读:只是在偶然的机会会出现。很少会出现。它在运行更新语句的时候,有人执行添加语句。

丢失更新:说的事例,你经理在看某个员工的工资表时候。员工A可以加工资了。你把员工A的工资从5000上调5500了。人事部B也在看A的信息。只是修改A的人事信息。在同时更新时候覆盖了事务1.

接着SQL入门经典(九)的视图:

说些@@EERROR这个系统错误号。

先看SQL语句在一句句解释

declare @count int ;
set @count=0;
BEGIN TRAN
UPDATE dbo.test003 set name='test' where ID=4
select @count=@count+@@ERROR;
INSERT dbo.test003 VALUES(15,GETDATE(),'TEST_5')--这条语句会失败@@ERROR这个值会>0
select @count=@count+@@ERROR;
if(@count>0)
ROLLBACK TRAN
ELSE
COMMIT TRAN
--(0 行受影响) 说明@@ERROR是个错误号。如果发生错误就是>0的数字

TRY CATCH 看下面SQL语句

BEGIN TRY --TRY 开始
BEGIN TRAN
UPDATE dbo.test003 set name='test' where ID=4
INSERT dbo.test003 VALUES(15,GETDATE(),'TEST_5')
COMMIT TRAN
END TRY --TRY结束
BEGIN CATCH --如果TRY 发生错误就执行这里面语句
ROLLBACK TRAN
END CATCH
--这句代码执行结果是(0 行受影响)说明COMMIT TRAN 没有执行。执行了ROLLBACK TRAN
-- INSERT dbo.test003 VALUES(15,GETDATE(),'TEST_5')
-- 改为
--INSERT dbo.test003 VALUES(2,GETDATE(),'TEST_5')
--(2行受影响)TRY里面没有错误,就执行COMMIT TRAN不会执行CATCH里的代码

SQL入门经典(十) 之事务的更多相关文章

  1. 《SQL入门经典》总结

    <SQL入门经典>这本书从考试前就开了个头,一直到前两天才看完,拉的战线也够长的.放假来了,基本上什么内容都不记得了.好不容易看完了,就赶紧总结一下吧! 该书分为两大部分,第一部分是第1~ ...

  2. SQL入门经典(一)之简介

    今天是我第一天开通博客,也是我的第一篇博客.以后为大家带来第一篇关于学习技术性文章,这段时间会为大家带来是SQL入门学习.希望大家坚持读下去,因为学历有限.我也是初学者.语言表达能力不好和知识点不足, ...

  3. sql 入门经典(第五版) Ryan Stephens 学习笔记 后续——存储引擎

    一.引擎基础 1 查看系统支持的存储引擎 show engines; 2 查看表使用的存储引擎两种方法: a.show table status from database_name where na ...

  4. sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)

    第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的  DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...

  5. SQL入门经典(八) 之存储过程

    存储过程(stored procedure)有时候称为sproc,它是真正的脚本-或者更准确的说,他是批处理(batch)-它存储于数据库中,而不是淡出的文件中.无论如何,这个比较并不是很确定.存储过 ...

  6. sql 入门经典(第五版) Ryan Stephens 学习笔记 第五部分: 性能调整

    第十六章: 利用索引改善性能 1. create index 单字段索引:  create index index_name on table_name (column_name);唯一索引:     ...

  7. SQL入门经典(第四版)学习记录——欢迎来到SQL世界(一)

    1.结构化查询语言——SQL,关系型数据库通信的标准语言: 2.关系型数据库:表的逻辑单元组成,这些表在内部彼此关联,组成了关系型数据库: 3.SQL会话:用户用SQL命令语句与关系型数据库进行交互时 ...

  8. SQL入门经典(九) 之自定义函数

    UDF和存储过程很类似,用户自定义函数是一组有序的T-SQL语句,这些语句被预先优化和编译,并且可以作为一个单元来测试调用.UDF和存储过程的主要区别在于结果返回方式,为了能支持更多返回值,UDF比存 ...

  9. SQL入门经典(七) 之脚本和批处理

    什么是脚本.我们前面学的CREATE TABLE <table name> ,USE <database name>这些都是脚本,为什么用脚本.脚本存储到文件中并且可以重复利用 ...

随机推荐

  1. 利用OpenShift托管Node.js Web服务进行微信公众号开发

    最近写了一个微信的翻译机器人.用户只要关注该公众号,发送英文的消息,就能收到中文翻译的回复.有兴趣的读者可以扫描下面的二维码关注该公众号,尝试发送英文单词试试看.(有时候第一次发送单词会收到“该公众号 ...

  2. 终端 git log 修改样式

    git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d ...

  3. Zabbix(二)--第一台主机监控及触发器

    0x01 Create Host 安装完zabbix后从哪里入手?无非就是要添加监控目标,那本文就从添加监控一个主机入手,了解zabbix的各个基本功能 添加主机在“Configuration”选项卡 ...

  4. 5. Singleton(单例)

    意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 适用性: 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代 ...

  5. c++内存分布

    http://www.oschina.net/translate/cpp-virtual-inheritance 编译器会加入一些代码, 指针的转换操作编译器会自动加偏移

  6. es6中添加块级作用域的目的

    原本只有函数作用域和全局作用域两种,这就导致出现很多不方便的地方: 1)for循环问题:在看js高程的时候,纠结在第七章好久,就是一个这样的实例 function createFunctions(){ ...

  7. java学习教程

    java依然是目前比较流行的语言.虽然,本人是C#开发者,但是由于公司决定使用java开发,所以只好开始学习java.在学校时候只是接触过没有过深的学习过,而且参加工作后基本也一直在搞C#.好在,现在 ...

  8. 浅析 IDE跟编译器

    之前听别人总说你用啥IDE,直接用编译器. 总的来说IDE包含编译器,而编译器仅仅是IDE的一部分, IDE包括编辑器与编译器. IDE: 可以在IDE上面编写代码,然后编译运行,有错误还能调试.比如 ...

  9. Linux最常用命令之cd和ls

    为什么说是最常用的命令呢,因为从普及程度看,即使不怎么接触过Linux系统的人,大多数都会知道这两个命令:而从使用频率看,这两个命令也是当之无愧的首位.现在我们就来看看这两个命令. cd 篇:cd 即 ...

  10. java线程小结3

    1. 多线程概述 要实现多线程可以通过继承Thread和实现Runnable接口.不过这两者之间存在一些区别.其中最重要的区别就是,如果一个类继承Thread类,则不适合于多个线程共享资源,而实现了R ...