SQL入门经典(十) 之事务
事务是什么?事务关键在与其原子性。原子性概念是指可以把一些事情当作一个执行单元来看待。从数据库角度看待。他是指应该全部执行或者全部不执行一条或多条语句的最小组合。当处理数据时候经常确保一件事发生另一件事也随之发生。或者二件事都不发生。实际上可能达到程度是有几十件事情或者更多的事情都必须一起发生或者都不发生。来看一个一个经典事例。这个事例各大书籍讲事务都有。就是你去银行转帐给朋友。转了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入门经典(十) 之事务的更多相关文章
- 《SQL入门经典》总结
<SQL入门经典>这本书从考试前就开了个头,一直到前两天才看完,拉的战线也够长的.放假来了,基本上什么内容都不记得了.好不容易看完了,就赶紧总结一下吧! 该书分为两大部分,第一部分是第1~ ...
- SQL入门经典(一)之简介
今天是我第一天开通博客,也是我的第一篇博客.以后为大家带来第一篇关于学习技术性文章,这段时间会为大家带来是SQL入门学习.希望大家坚持读下去,因为学历有限.我也是初学者.语言表达能力不好和知识点不足, ...
- sql 入门经典(第五版) Ryan Stephens 学习笔记 后续——存储引擎
一.引擎基础 1 查看系统支持的存储引擎 show engines; 2 查看表使用的存储引擎两种方法: a.show table status from database_name where na ...
- sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)
第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的 DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...
- SQL入门经典(八) 之存储过程
存储过程(stored procedure)有时候称为sproc,它是真正的脚本-或者更准确的说,他是批处理(batch)-它存储于数据库中,而不是淡出的文件中.无论如何,这个比较并不是很确定.存储过 ...
- sql 入门经典(第五版) Ryan Stephens 学习笔记 第五部分: 性能调整
第十六章: 利用索引改善性能 1. create index 单字段索引: create index index_name on table_name (column_name);唯一索引: ...
- SQL入门经典(第四版)学习记录——欢迎来到SQL世界(一)
1.结构化查询语言——SQL,关系型数据库通信的标准语言: 2.关系型数据库:表的逻辑单元组成,这些表在内部彼此关联,组成了关系型数据库: 3.SQL会话:用户用SQL命令语句与关系型数据库进行交互时 ...
- SQL入门经典(九) 之自定义函数
UDF和存储过程很类似,用户自定义函数是一组有序的T-SQL语句,这些语句被预先优化和编译,并且可以作为一个单元来测试调用.UDF和存储过程的主要区别在于结果返回方式,为了能支持更多返回值,UDF比存 ...
- SQL入门经典(七) 之脚本和批处理
什么是脚本.我们前面学的CREATE TABLE <table name> ,USE <database name>这些都是脚本,为什么用脚本.脚本存储到文件中并且可以重复利用 ...
随机推荐
- html导入css样式的方法
在html网页中引入css样式表主要有一下四种方法 1.行内引入 <p style="width:100px;height:40px;color:red;"></ ...
- List集合基于某个字段排序
using System; using System.Collections.Generic; namespace ConsoleApplication1 { class Product { publ ...
- 初学git(一):创建本地“仓库”
初学git(一):创建本地“仓库” 作为一个初学者,我是跟着廖学峰老师的官方博客学习,这里只是做个笔记,哈哈,关于git的历史.和其他版本控制的对比啥的,我就不说了.另外,我这里用的是Mac OS X ...
- 第一课1、ROS
---恢复内容开始--- 1.什么是ROS ROS起源于2007年,斯坦福大学的人工智能实验室与机器人技术公司Willow Garage针对其个人机器人项目开发了ROS的雏形. ROS大致每年发布一个 ...
- IIS配置excel 权限
http://www.cnblogs.com/zhuxiaohui/archive/2013/10/16/3371637.html
- java中用spring实现数组类型输出
java 中的几个数组类型 1.Department类 package com.yy.collection; import java.util.List; import java.util.Map; ...
- Twitter Bootstrap
Twitter Bootstrap是一个HTML/CSS/JS框架,适用于移动设备优先的响应式网页开发.主要涉及: HTML:为已有的H5标签扩展了自定义属性 data-* CSS : Reset + ...
- 探 寻 宝 藏--- DP
题目描述 传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物.某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物就藏在右下角,迷宫的进出口在左上角.当然,迷宫中的通路不是平坦 ...
- 图片轮播 js代码
<script type="text/javascript"> //图片轮换 $(function () { //------------------ var sWid ...
- group_concat函数详解
来自: http://hchmsguo.iteye.com/blog/555543 MySQL中group_concat函数 完整的语法如下: group_concat([DISTINCT] 要连接的 ...