1、SQL事务的概念
事务是一种机制、是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。因此事务是一个不可分割的工作逻辑单元。在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的。这特别适用于多用户同时操作的数据通信系统。例如:订票、银行、保险公司以及证券交易系统等。
2、SQL事务的属性
(1) 原子性(Atomicity):事务是一个完整的操作。
(2) 一致性(Consistency):当事务完成时,数据必须处于一致状态。
(3) 隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的。
(4) 持久性(Durability):事务完成后,它对于系统的影响是永久性的。
3、T-SQL中管理事务的语句:
(1)开始事务: begin transaction
(2)提交事务:commit transaction
(3)回滚事务: rollback transaction
4、SQL事务分类:
(1) 显式事务:用begin transaction明确指定事务的开始。
(2) 隐性事务:set implicit_transactions on,当以隐性事务模式操作时,SQL Server将在提交或回滚事务后自动启动新事务。无法描述事务的开始,只需要提交或回滚事务。
(3)自动提交事务:SQL Server的默认模式,set implicit_transactions off --自动提交事务模式,它将每条单独的T-SQL语句视为一个事务。如果成功执行,则自动提交,否则回滚。
5、创建事务完整过程事例:
(1)、Begin transaction
(2)、声明变量用于累计错误号,错误号使用全局变量@@ERROR
(3)、为2中声明的变量赋初值0
(4)、执行要进行的数据库操作(单条)
(5)、set 变量=@变量+@ERROR --累加错误序号
(6)、重复执行4、5步骤,知道执行完所有的操作
(7)、使用if…else语句判断累加错误号,大于0则回滚,否则提交事务。
1 --[1]创建数据表,并插入测试数据 2 USE DemoDB 3 GO 4 --创建银行账户表bank 5 IF EXISTS(SELECT *FROM sysobjects WHERE name='bank') 6 DROP TABLE bank 7 GO 8 CREATE TABLE bank 9 ( 10 customerName char(20),--客户姓名 11 currentMoney money--当前余额 12 ) 13 GO 14 --添加约束,账户余额不能少于1元 15 ALTER TABLE bank 16 ADD CONSTRAINT CK_currentMoney CHECK(currentMoney>=1) 17 GO 18 --插入测试数据 19 INSERT INTO bank(customerName,currentMoney) VALUES('张三',500) 20 INSERT INTO bank(customerName,currentMoney) VALUES('李四',2000) 21 -- 22 PRINT '转账之前的余额' 23 SELECT * FROM bank 24 GO 25 26 --开始事务(从此处开始,后续的T-SQL语句是一个整体) 27 --[1]开始事务 28 BEGIN TRAN 29 --[2]定义变量,用于累计事务执行过程中的错误 30 DECLARE @error int 31 --[3]给【2】中声明的变量赋值 32 SET @error=0 33 --[4]开始转账,张三的账户中减500 34 UPDATE bank SET currentMoney=currentMoney-300 WHERE customerName='张三' 35 --[5]累加错误 36 SET @error=@error+@@ERROR 37 ----重复执行,【4】,【5】 38 --李四账户加500 39 UPDATE bank SET currentMoney =currentMoney+300 WHERE customerName='李四' 40 SET @error=@error+@@ERROR 41 42 PRINT '查看转账过程中的余额' 43 SELECT * FROM bank 44 45 --[6]使用IF..ELSE去判断累加的错误号,确定事务是提交还是回滚(撤消) 46 IF (@error>0) 47 BEGIN 48 PRINT '交易失败!回滚事务' 49 ROLLBACK TRAN --回滚事务 50 END 51 ELSE 52 BEGIN 53 PRINT '交易成功,提交事务,写入硬盘!' 54 COMMIT TRAN --提交事务 55 END 56 57 --查看转账事务后的余额 58 PRINT '查看转账事务后的余额' 59 SELECT * FROM bank 60 GO