一、sqlserver数据库相关知识:

1.sqlserver中事务总结:begin tran,rollback tran,commit tran 

第1个相关用法:摘自:https://shiyousan.com/post/f13d29b7-0d87-4168-bd8b-8b28b0991b5a

以下是出现错误的SQL部分语句:

此错误的原因是由于一个事务只能对应一个操作,要么回滚要么提交,所以执行了ROLLBACK TRAN语句后一定不能再执行COMMIT TRAN语句!!!而无论是回滚事务还是提交事务,都是不会中断SQL处理流程的,要想中断流程就需要使用RETURN语句。

上面范例中的语句先执行了ROLLBACK TRAN回滚操作(这里造成事务已经处理完成),但是并没有中断流程,所以后面的语句依然会继续执行。执行过程中由于没有任何异常错误,最终导致重复执行了底部的COMMIT TRAN事务提交操作,最后一次事务操作没有找到相匹配的事务声明,就会提示"COMMIT TRANSACTION(事务提交) 请求没有对应的 BEGIN TRANSACTION(事务声明)"这个错误。

所以要跳出事务,在进行回滚ROLLBACK操作后,还必须马上使用RETURN语句跳出执行流程。以下为修改后的语句:

这里在做一个简单测试,有助于理解所谓的一个事务只能对应一个事务操作的意思,在SQL中输入下图的三行代码并执行:

总结: roolback 之后不能再次commit,事务只能开启一个!!!

第2个用法总结:https://www.cnblogs.com/accumulater/p/6089822.html

SQL事务用法begin tran,commit tran和rollback tran的用法

Sql Server 2005/2008中提供了begin tran,commit tran和rollback tran来使用事务。

begin tran表示开始事务,

commit tran表示提交事务,

rollback tran表示回滚事物

EXEC TEST_PROC '文综','包括历史,地理,政治','政治','文综的一门' 
CREATE PROCEDURE [dbo].[TEST_PROC] 
@A_Name NVARCHAR(20), -- A表姓名 
@A_Remark NVARCHAR(4000), -- A表备注 
@B_Name NVARCHAR(20), -- B表姓名 
@B_Remark NVARCHAR(4000) -- B表备注 
AS 
BEGIN TRY 
BEGIN TRAN 
-- 在A表中插入数据 
INSERT INTO [dbo].[A] 
( [A_Name] 
, [A_Remark] ) 
VALUES 
( @A_Name 
, @A_Remark ) 
-- 在B表中插入数据 
INSERT INTO [dbo].[B] 
( [A_ID] 
, [B_Name] 
, [B_Remark] ) 
VALUES 
( @@IDENTITY -- 返回最后插入的标识值 
, @B_Name 
, @B_Remark ) 
COMMIT TRAN 
END TRY 
BEGIN CATCH 
ROLLBACK TRAN 
INSERT INTO [dbo].[ErrorLog] 
( [EL_Procedure] -- 异常存储过程名称 
, [EL_OperateTime] ) -- 报异常时间 
VALUES 
( 'TEST_PROC' 
, CONVERT(DATETIME,GETDATE(),20) ) 
END CATCH

注:1. @@IDENTITY的作用是返回最后插入的标识值。 
2. 我在rollback tran中加入一个专门记录异常的表,以便产于异常发生的时间和确定报异常的存储过程的名称。 
原文链接: 
begin tran 可以理解成新建一个还原点。 
commit tran提交这个自begin tran开始的修改 
rollback tran 表示还原到上个还原点

二、IndexedDB知识点总结:

转自:https://blog.csdn.net/ffj0721/article/details/80984591

indexedDB简介

indexedDB是一个前端存储数据库,之前也没有什么了解,这次项目中需要用到,然后就去找了相关资料。数据库有两种,一种是关系型数据库,另一种是非关系型数据库。indexedDB是第二种,它是非关系型数据库,它不需要你去写一些特定的sql语句来对数据库进行操作,数据形式使用的是json。

与其他前端存储方式对比

>
也许熟悉前端存储的会说,不是有了LocalStorage和Cookies吗?为什么还要推出indexedDB呢?其实对于在浏览器里存储数据,你可以使用cookies或local storage,但它们都是比较简单的技术,而IndexedDB提供了类似数据库风格的数据存储和使用方式。

首先说说Cookies,英文直接翻译过来就是小甜点,听起来很好吃,实际上并不是,每次HTTP接受和发送都会传递Cookies数据,它会占用额外的流量。例如,如果你有一个10KB的Cookies数据,发送10次请求,那么,总计就会有100KB的数据在网络上传输。Cookies只能是字符串。浏览器里存储Cookies的空间有限,很多用户禁止浏览器使用Cookies。所以,Cookies只能用来存储小量的非关键的数据。
其次说说LocalStorage,LocalStorage是用key-value键值模式存储数据,但跟IndexedDB不一样的是,它的数据并不是按对象形式存储。它存储的数据都是字符串形式。如果你想让LocalStorage存储对象,你需要借助JSON.stringify()能将对象变成字符串形式,再用JSON.parse()将字符串还原成对象。但如果要存储大量的复杂的数据,这并不是一种很好的方案。毕竟,localstorage就是专门为小数量数据设计的,所以它的api设计为同步的。而IndexedDB很适合存储大量数据,它的API是异步调用的。IndexedDB使用索引存储数据,各种数据库操作放在事务中执行。IndexedDB甚至还支持简单的数据类型。IndexedDB比localstorage强大得多,但它的API也相对复杂。对于简单的数据,你应该继续使用localstorage,但当你希望存储大量数据时,IndexedDB会明显的更适合,IndexedDB能提供你更为复杂的查询数据的方式。

indexedDB特性

对象仓库
indexedDB中没有表的概念,而是objectStore,一个数据库中可以包含多个objectStore,objectStore是一个灵活的数据结构,可以存放多种类型数据。也就是说一个objectStore相当于一张表,里面存储的每条数据和一个键相关联。我们可以使用每条记录中的某个指定字段作为键值(keyPath),也可以使用自动生成的递增数字作为键值(keyGenerator),也可以不指定。选择键的类型不同,objectStore可以存储的数据结构也有差异。
键类型 存储数据
不使用 任意值,但是每添加一条数据的时候,需指定键参数
keyPath 对象,eg: {keyPath: ‘id’}
keyGenerator 任意值 eg: {autoincrement: true}
keyPath and KeyGenerator 都使用 对象,如果对象中有keyPath指定的属性则不生成新的键值,如果没有自动生成递增键值,填充keyPath指定的属性
事务性
在indexedDB中,每一个对数据库操作是在一个事务的上下文中执行的。事务范围一次影响一个或多个object stores,你通过传入一个object store名字的数组到创建事务范围的函数来定义。例如:db.transaction(storeName, ‘readwrite’),创建事务的第二个参数是事务模式。当请求一个事务时,必须决定是按照只读还是读写模式请求访问。

基于请求
对indexedDB数据库的每次操作,描述为通过一个请求打开数据库,访问一个object store,再继续。IndexedDB API天生是基于请求的,这也是API异步本性指示。对于你在数据库执行的每次操作,你必须首先为这个操作创建一个请求。当请求完成,你可以响应由请求结果产生的事件和错误。

异步
在IndexedDB大部分操作并不是我们常用的调用方法,返回结果的模式,而是请求—响应的模式,所谓异步API是指并不是这条指令执行完毕,我们就可以使用request.result来获取indexedDB对象了,就像使用ajax一样,语句执行完并不代表已经获取到了对象,所以我们一般在其回调函数中处理。

使用示例

打开数据库

判断浏览器是否支持indexedDB数据库
var indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.msIndexedDB;
if(!indexedDB)
{
console.log("你的浏览器不支持IndexedDB");
}
1
2
3
4
5
创建请求打开indexedDB,IndexedDB需要你创建一个请求来打开它。
var request = indexedDB.open(name, version);
1
第一个参数是数据库的名称,第二个参数是数据库的版本号。版本号可以在升级数据库时用来调整数据库结构和数据。但你增加数据库版本号时,会触发onupgradeneeded事件,这时可能会出现成功、失败和阻止事件三种情况:

request.onerror = function(e) { // 失败
console.log(e.currentTarget.error.message);
};

request.onsuccess = function(e) { // 成功
myDB.db = e.target.result;
console.log('成功打开DB');
};

request.onupgradeneeded = function(e) {
var db = e.target.result;
if (!db.objectStoreNames.contains('person')) {
console.log("我需要创建一个新的存储对象");
//如果表格不存在,创建一个新的表格(keyPath,主键 ; autoIncrement,是否自增),会返回一个对象(objectStore)
var objectStore = db.createObjectStore('person', {
keyPath: "id",
autoIncrement: true
});

//指定可以被索引的字段,unique字段是否唯一

objectStore.createIndex("name", "name", {
unique: false
});

objectStore.createIndex("phone", "phone", {
unique: false
});

}
console.log('数据库版本更改为: ' + version);
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
onupgradeneeded事件在第一次打开页面初始化数据库时会被调用,或在当有版本号变化时。所以,你应该在onupgradeneeded函数里创建你的存储数据。如果没有版本号变化,而且页面之前被打开过,你会获得一个onsuccess事件。

添加数据

创建一个事务,并要求具有读写权限
var transaction = db.transaction(storeName, 'readwrite');
1
获取objectStore,调用add方法添加数据
var store = transaction.objectStore(storeName); //访问事务中的objectStore
data.forEach(function (item) {
store.add(item);//保存数据
});
1
2
3
4
删除数据

创建事务,然后调用删除接口,通过key删除对象
var transaction = db.transaction(storeName, 'readwrite');

var store = transaction.objectStore(storeName);

store.delete(key);
1
2
3
4
5
查找数据

按key查找 开启事务,获取objectStore,调用往get()方法,往方法里传入对象的key值,取出相应的对象
var transaction = db.transaction(storeName, 'readwrite');

var store = transaction.objectStore(storeName);

var request = store.get(key);

request.onsuccess = function(e) {

data = e.target.result;

console.log(student.name);

};
1
2
3
4
5
6
7
8
9
10
11
12
13
使用索引查找
var transaction = db.transaction(storeName);

var store = transaction.objectStore(storeName);

var index = store.index(search_index);

index.get(value).onsuccess = function(e) {

data = e.target.result;

console.log(student.id);

}
1
2
3
4
5
6
7
8
9
10
11
12
13
游标遍历数据
var transaction = db.transaction(storeName);

var store = transaction.objectStore(storeName);

var request = store.openCursor();//打开游标

var dataList = new Array();

var i = 0;

request.onsuccess = function(e) {

var cursor = e.target.result;

if (cursor) {

console.log(cursor.key);

dataList[i] = cursor.value;

console.log(dataList[i].name);

i++;

cursor.continue();

}

data = dataList;

};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
更新对象

更新对象,首先要把它取出来,修改,然后再放回去。
1
var transaction = db.transaction(storeName, 'readwrite');

var store = transaction.objectStore(storeName);

var request = store.get(key);

request.onsuccess = function(e) {

var data = e.target.result;

for (a in newData) {

//除了keypath之外

data.a = newData.a;

}

store.put(data);

};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
关闭与删除数据库

关闭数据库可以直接调用数据库对象的close方法
1
function closeDB(db) {

db.close();

}
1
2
3
4
5
删除数据库使用数据库对象的deleteDatabase方法
1
function deleteDB(name) {

indexedDB.deleteDatabase(name);

}

转载于:https://www.cnblogs.com/newcapecjmc/p/10240900.html

数据库知识总结:sqlserver中事务总结:begin tran,rollback tran,commit tran +IndexDB总结...相关推荐

  1. limit实现原理 mysql_解读数据库:深入分析MySQL中事务以及MVCC的实现原理

    什么是事务 事务(Transaction)是由一系列对数据库中的数据进行访问与更新的操作所组成的一个程序执行单元. 在同一个事务中所进行的操作,要么都成功,要么就什么都不做.理想中的事务必须满足四大特 ...

  2. sqlserver 中事务与错误机制的处理

    成功返回1并提交事务,错误返回0并回滚事务 BEGIN try   begin tran   --其中userName为varchar类型,数据库中该字段存在不为int类型的数据,必然导致错误   u ...

  3. 数据库知识:SQLServer变量相关知识介绍

    今天给大家分享SQLServer变量相关介绍,希望对大家能有所帮助! 1.概述 SQLServer变量对应内存中的一个存储空间.它和常量不同,变量的值可以在执行过程中改变. 2.分类 SQLServe ...

  4. sqlserver数据库备份成为sqlserver中的bak格式

    1.在要备份的数据库上面进行右键=>任务=>备份 2.在打开的备份中先删除指定的后,然后在从新选择路径进行添加 3.点击... 进行从新选择路径 4.然后点击保存 5.保存提示: 这样就在 ...

  5. day18-事务与连接池 3.jdbc中事务操作介绍

    那么我们都是通过程序操作数据库.所以要了解jdbc下怎样对事务操作.jdbc如何操作事务? 自动事务false那就不开了呗相当于开启事务. package cn.itcast.transaction; ...

  6. mysql数据库的事物日志在哪里_mysql数据库中事务日志的作用

    mysql数据库中事务日志的作用 发布时间:2020-06-28 18:13:39 来源:亿速云 阅读:98 作者:Leah 这篇文章将为大家详细讲解有关mysql数据库中事务日志的作用,文章内容质量 ...

  7. 数据库:SQLServer中in和 exists函数用法笔记

    今天给大家分享一下SQLServer中in和 exists 用法,希望能对大家有所帮助. 一.IN 用法 确定指定的值是否与子查询或列表中的数据相匹配. 1.1 语法格式 test_expressio ...

  8. sqlserver中创建包含事务的存储过程

    什么是事务 事务时包含1条或多条语句的逻辑单元.事务中的语句是一个整体,要么一起提交,要么一起撤销.事务在提交前可以回滚,一旦提交就不能撤销修改了,是永久性的修改. 为什么使用事务 可以例举生活中的例 ...

  9. 如何在SQLServer中处理每天四亿三千万记录的(数据库大数据处理)

    http://blog.csdn.net/wybshyy/article/details/52064289 首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是 ...

  10. 如何将oracle数据库中的表结构导入到sqlserver中,Oracle转换成SqlServer数据库的步骤...

    1 背景 ITM系统目前支持MysqL.Oracle数据库,由于现在需要和CA产品进行结合,用CA产品的采集功能进行数据采集,因此需要使用CA产品的sqlServer数据库,为了使得系统支持sqlse ...

最新文章

  1. R语言data.table导入数据实战:data.table生成新的数据列(基于已有数据列)、生成多个数据列
  2. oracle单表高并发,见过这么高并发( logons current)的数据库么?
  3. 初识makefile
  4. 华为手机怎么隐藏按键图标_华为手机隐藏技巧,一键简单设置,让沟通更加便捷...
  5. 云网络的守护神:主动链路监控
  6. centos8 安装nvidia 显卡驱动(一路踩坑一路填)
  7. ROS-WIKI——编写简单的发布者和订阅者(C++和Python版本)
  8. 8条体面的程序员偷懒技巧
  9. 中国冷凝管行业市场供需与战略研究报告
  10. BZOJ3876 [Ahoi2014Jsoi2014]支线剧情 【有上下界费用流】
  11. 测量学用C语言编程求子午线弧长,GPS数据解析 数据拆分 坐标转换 显示线路图源代码...
  12. psd效果预览转成网站首页(html+css)
  13. 责任链模式的高级用法
  14. 电荷泵负电源芯片SGM3207
  15. AndroidStudio
  16. Android状态栏添加快捷开关(Tile)
  17. 纪念第一次面试安服-靶机测试过程以及思路
  18. .Net Core裁剪图片并存入数据库
  19. 使用ps完成手写数字图片(用于验证手写数字模型或制作数据集)
  20. 远心镜头与普通镜头的不同处

热门文章

  1. matlab portcons,马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(二)...
  2. Markowitz有效边界投资组合——利用python
  3. 只有英语四级和计算机二级,通过英语四级和计算机二级用英语怎么说
  4. 阿里倡导成立“罗汉堂”, 6名诺贝尔奖得主加入
  5. AVR单片机开发11——1602液晶屏幕
  6. 【北京工业大学申请个人学生邮箱】
  7. 机器学习算法----KNN K邻近 (K值的选择) (学习笔记)
  8. Maya入门教程— 如何使用MAYA贴图?MAYA给模型贴图教程
  9. 微软官网免费下载win10系统
  10. 曲苑杂坛--修改数据库服务器名称