首页 > 数据库 >013 数据库学习笔记--事务

013 数据库学习笔记--事务

时间:2023-06-12 18:24:44浏览次数:43  
标签:begin 事务 varchar -- 数据库 50 int 013

事务:

  • 由一系列T-SQL语句构成的逻辑工作单元,为了完成一定的业务逻辑,将操作封装起来,可以是一个操作,也可以是多个操作。
  • 与其他语句形成边界,形成一个相对独立的工作单元。

事务应用:

  • 多个表进行操作时使用;
  • 处理过程中,出现了某种异常或系统死机或断电,数据并不会保持到数据库

 事务的处理结果:

  • 事务没有发生任何错误,事务全部被提交
  • 如果有某一个操作发生错误或发生故障,则所有的操作都会被全部回滚到最初状态

作用: 

  • 通过事务提高数据的安全性
  • 增强了数据的处理效率
  • 维护数据库的完整性

事务的特性:ACID

  • A:原子性,Atomic一个工作单元,一个整体提交或回滚,各个元素是密不可分的——一个操作;
  • C:一致性,ConDemoltent 数据必须保持一致,数据状态一致
  • I:隔离性,Isolated多个事务之间是彼此隔离的——事务独立性
  • D:持久性,Durabiliy 事务提交后,对数据库的更改是永久保存的,即使系统出现故障,也会保留,真实的修改了数据库

事务分类:

  • 显式事务
    • 明确指出事务的起止边界。如果不显式定义事务的边界,SQL Server 会默认把每个单独的语句作为-一个事务;换句话说,SQLServer默认在执行完每个语句之后就自动提交事务
    • 显示事务需要定义以BEGIN TRAN语句作为开始。如果想提交事务,则应该以COMMIT TRAN语句显式结束事务;如果不想提交事务(撤消事务中的修改),则应该以ROLLBACK TRAN语句显式结束事务
  • 隐式事务
    • SQL查询分析器中,当前会话默认就是为隐式事务。每执行一条DML操作,就直接提交到数据库保存

开启显式事务:begin tran

开启隐式事务:begin tran  \r\n  set  implicit_transaction on

关闭隐式事务:set  implicit_transaction off

语法:

--开启事务
begin try 
	begin tran 
	--set implicit_transactions on;--开启一个隐式事务

	--一系列T-SQL操作、insert\update\delete

	commit tran--提交事务
end try
begin catch
	
	rollback tran --事务回滚
end catch	

示例:

--开启事务
begin try 
	begin tran 
	--set implicit_transactions on;--开启一个隐式事务

	--一系列T-SQL操作、insert\update\delete
	insert into [dbo].[student] values('测试事务',10,'未知')
	delete from [student] where student_name='张三'

	print '操作成功';
	commit tran--提交事务
end try
begin catch
	print '操作出现异常';
	rollback tran --事务回滚
end catch	


--注:事务一般应用于存储过程之中

应用:

ALTER   procedure [dbo].[INIT_DICT_QUEUECODE]
(
	 @p_QUEUEID int,
	 @p_QUEUENAME  varchar(100),
	 @p_DEVICECOUNT int, 
	 @p_CHECKDURATION int,
	 @p_BEGINTIMEPART varchar(50),
	 @p_ENDTIMEPART varchar(50),
	 @p_CODECOUNT int,
	 @p_QUEUESIGN varchar(50),
	 @p_ADDRESS varchar(300),
	 @p_REMARK varchar(500),
	 @p_ofdepart varchar(30),
	 @p_PMBEGINTIME varchar(50),
	 @p_PMENDTIME varchar(50),
	 @p_CodeCoefficient varchar(50),
	 @p_TIMEPART varchar(50),
	 @p_PARAMTYPE  varchar(50),
	 @p_CALLTYPE varchar(50),
	 @p_result int output
)
as
insert into QS_PARAM (QUEUEID, QUEUENAME, DEVICECOUNT, CHECKDURATION, BEGINTIMEPART, ENDTIMEPART, CODECOUNT,QUEUESIGN,ADDRESS,ofdepart,PMBEGINTIME, PMENDTIME, CodeCoefficient, TIMEPART,PARAMTYPE,CALLTYPE,REMARK)
values(@p_QUEUEID, @p_QUEUENAME, @p_DEVICECOUNT, @p_CHECKDURATION, @p_BEGINTIMEPART, @p_ENDTIMEPART, @p_CODECOUNT,@p_QUEUESIGN,@p_ADDRESS,@p_ofdepart,@p_PMBEGINTIME, @p_PMENDTIME, @p_CodeCoefficient, @p_TIMEPART,@p_PARAMTYPE,@p_CALLTYPE,@p_REMARK)
declare 
	@loopNum int,--循环次数
	 @codeNum int,--号源编号
	 @codeFirstAm int,
	 @codeFirstPm int
DECLARE  paramDetails cursor 
for 
	select queuename,paramtype,begintimepart,endtimepart,ofdepart,calltype,codecount from qs_param  a 
	where a.queueid=@p_QUEUEID and a.paramtype=@p_PARAMTYPE order by convert(float,endtimepart)
 begin  try
	 set @loopNum=1
	 set @codeNum=1
	 set @codeFirstAm=0--未进行初始化
	 set @codeFirstPm=0--未进行初始化
	--删除号源字典
	 delete from dict_queuecode  where queuename=@p_QUEUENAME and codeparamtype=@p_PARAMTYPE and ofdepart=@p_ofdepart
    --开始事务
	begin tran --当前事务点,rollback、commit都从这里开始    
	DECLARE
					 @v_QUEUEID int,
					 @v_QUEUENAME  varchar(100),
					 @v_DEVICECOUNT int, 
					 @v_CHECKDURATION int,
					 @v_BEGINTIMEPART varchar(50),
					 @v_ENDTIMEPART varchar(50),
					 @v_CODECOUNT int,
					 @v_QUEUESIGN varchar(50),
					 @v_ADDRESS varchar(50),
					 @v_ofdepart varchar(30),
					 @v_PMBEGINTIME varchar(50),
					 @v_PMENDTIME varchar(50),
					 @v_CodeCoefficient varchar(50),
					 @v_TIMEPART varchar(50),
					 @v_PARAMTYPE  varchar(50),
					 @v_CALLTYPE varchar(50)
 open paramDetails
 fetch next from paramDetails into @v_queuename,@v_paramtype,@v_begintimepart,@v_endtimepart,@v_ofdepart,@v_calltype,@v_codecount
		WHILE @@FETCH_STATUS =0
		 begin
					--循环获取qs_param表中维护的某个时间段
					set @loopNum=1
					 while @loopNum <= @v_codecount 
							 begin
								--上午
								  if @codeFirstAm=0 and @v_calltype='上午' 
									  begin
											set @codeNum=1
											set @codeFirstAm=1
										end
								--下午
								  if @codeFirstPm=0 and @v_calltype='下午' 
									  begin
											set @codeNum=1
											set @codeFirstPm=1
										end
								  --添加号源信息
									insert into DICT_QUEUECODE  (queuename,codeparamtype,codevalue,timepart,hintinfo,OFDEPART,calltype,queueid)
									values (@v_queuename,@v_paramtype,@codeNum,@v_begintimepart+'~'+@v_endtimepart,'',@v_ofdepart,@v_calltype,@p_QUEUEID)
								  --重新赋值
									 set @loopNum=@loopNum+1
									 set @codeNum=@codeNum+1
							end
		fetch next from paramDetails into @v_queuename,@v_paramtype,@v_begintimepart,@v_endtimepart,@v_ofdepart,@v_calltype,@v_codecount
		end
		close paramDetails
		DEALLOCATE  paramDetails
		set @p_result=1
    --提交事务
	commit    
end try
begin catch
      set @p_result=-1 
	--回滚事务
	rollback    
end catch

  

 

标签:begin,事务,varchar,--,数据库,50,int,013
From: https://www.cnblogs.com/YYkun/p/17475689.html

相关文章

  • ESXi 7.0 U3m NEC (日电) 定制版 OEM Custom Installer CD
    VMwareESXi7.0Update3m-领先的裸机Hypervisor(AllOEMCustomizedInstallerCDs)ESXi7.0U3mStandard(标准版)ESXi7.0U3mDell(戴尔)定制版OEMCustomInstallerCDESXi7.0U3mHPE(慧与)定制版OEMCustomInstallerCDESXi7.0U3mLenovo(联想)定制......
  • 闭包
    1、定义指能够访问另一个函数作用域中的变量的一个函数(定义在一个函数内部的函数)2、作用(1)防止全局污染(2)利用其可突破作用域链,将函数内部的变量和方法传递到外部,让外部函数可以访问到内部函数的变量和方法3、优点(1)形成闭包的函数在执行之后,不会被回收,依旧存在内存中(2)私有变......
  • MVC 模式和三层架构
    1.MVC模式‍MVC模式和三层架构是一些理论的知识,将来我们使用了它们进行代码开发会让我们代码维护性和扩展性更好。‍MVC是一种分层开发的模式,其中:M:Model,业务模型,处理业务V:View,视图,界面展示C:Controller,控制器,处理请求,调用模型和视图​​‍控制器(serlvlet)用来接收浏......
  • win10系统开启同时多用户远程连接桌面,支持22H2,版本10.0.19041.2075
    1.打开远程桌面控制并开启多用户连接1)win+r打开运行窗口,输入gpedit.msc,进入“本地组策略编辑器”2)按以下步骤找到远程桌面会话主机:计算机配置-->管理模板-->Windows组件-->远程桌面服务-->远程桌面会话主机-->连接 3)编辑远程桌面会话主机连接 3.1)双击“允许用户通......
  • DotNet 自定义模板
    目录DotNet自定义模板创建目录结构template.json生成本地模板使用本地模板生成项目发布到Nuget参考资料DotNet自定义模板创建目录结构下面以artizan-abp-microservice项目为例,解决方案结构:基于该项目创建dotnet模板,首先,创建文件夹templates,所有的项目模板将保存......
  • 【Ubuntu22.04】安装MySQL数据库,修改root用户密码,实现远程访问,
    预备条件本次实验使用静态IP的地址192.168.1.81作为mysql-001服务器地址,并配置为本地域名mysql-001:打开Powershell(Window自带)使用SSH方式连接服务器,用户名test,密码:123456:安装Mysql:更新软件源aptupdate安装MySQL8.0,因为Ubuntu22.04不支持MySQL5.7sudoaptinst......
  • 经验分享 - 我是如何拿到硅谷顶级科技公司的 10 个 offer ?
    代我太太发文:经过3个月精心准备,我拿到了Google,Facebook,Netflix,linkedin,Snapchat,RokuTV,Amazon,Signal,Wealthfront,ToyotaResearchInstitute一共10个硅谷公司的offer。airbnb结果还没出,uber,dropbox面试体验不好,最后onsite直接withdraw。SoundhoundintuitHR自己说......
  • 数据库Navicat for MySQL 初步学习
     首先引入命名空间然后 staticMySqlConnectionconn=null;  在里面定义我们数据库的位置  目前联系的是本地数据库所有就按本地来 第二数据库内容包括 增 删 改 查  其中的 MySqlCommandcmd=newMySqlCommand("insertintouserinfosetname='xi......
  • .Net7矢量化的性能优化
    前言矢量化是性能优化的重要技术,也是寄托硬件层面的优化技术。本篇来看下。概括一:矢量化支持的问题:矢量化的System.Runtime.Intrinsics.X86.Sse2.MoveMask函数和矢量化的Vector128.Create().ExtractMostSignificantBits()函数返回的结果是一样的。但是前者只能在支持SSE2的......
  • 前端登录流程
    1、首次登录,前端调用后端登录接口,发送用户名密码2、后端收到请求,验证用户名密码。成功,返回给前端token和一个用户信息的值(token:后台发的唯一标识,用来验证用户是否登录)3、前端拿到token,将token存储到sessionStorage中,并跳转路由页面4、前端每次跳转路由,判断cookies中是否有toke......