数据库事务的创建

2025-10-22 03:51:54

1、为什么要用到事务?

例如,银行转账问题:

假定资金从账户A转到账户B,至少需要两步:

a.账户A的资金减少

b.然后账户B的资金相应增加 

数据库事务的创建

2、假定张三的账户直接转账1000元到李四的账户

CREATE TABLE bank

(

    customerName CHAR(10),  --顾客姓名

    currentMoney MONEY     --当前余额

)

GO

--添加check 约束 ,当前余额要大于等于1元

ALTER TABLE bank

   ADD CONSTRAINT CK_currentMoney    

       CHECK(currentMoney>=1)

GO

--添加数据

INSERT INTO bank(customerName,currentMoney)    VALUES('张三',1000)

INSERT INTO bank(customerName,currentMoney)    VALUES('李四',1)

数据库事务的创建

3、目前两个账户的余额总和为:1000+1=1001元 

数据库事务的创建

4、模拟实现转账 :

   从张三的账户转账1000元到李四的账户

/*--转账测试:张三转账1000元给李四--*/

--我们可能会这样这样编写语句

--张三的账户少1000元,李四的账户多1000元

UPDATE bank SET currentMoney=currentMoney-1000 

     WHERE customerName='张三'

UPDATE bank SET currentMoney=currentMoney+1000 

     WHERE customerName='李四'

GO

--再次查看转账后的结果。 

SELECT * FROM bank

GO

--查询结果

张三的账户没有减少 

但李四的账户却多了1000元 

1000+1001=2001元    总额多出了1000元!

数据库事务的创建

5、错误原因分析:

--张三的账户减少1000元,李四的账户增加1000元

UPDATE bank 

   SET currentMoney=currentMoney-1000 

     WHERE customerName='张三'

UPDATE bank 

   SET currentMoney=currentMoney+1000 

     WHERE customerName='李四'

GO

--两句同时执行,张三账户减少1000 ,余额0,UPDATE语句违反约束:余额>=1元。所以执行失败,继续往下执行:执行成功,所以李四变为1001元

数据库事务的创建

6、事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作

这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行 

转账过程就是一个事务。

它需要两条UPDATE语句来完成,这两条语句是一个整体,如果其中任一条出现错误,则整个转账业务也应取消,两个账户中的余额应恢复到原来的数据,从而确保转账前和转账后的余额不变,即都是1001元。

7、事务必须具备以下四个属性,简称ACID 属性:

原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行

一致性(Consistency):当事务完成时,数据必须处于一致状态

隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务

永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性

8、T-SQL使用下列语句来管理事务:

开始事务:BEGIN TRANSACTION

提交事务:COMMIT TRANSACTION

回滚(撤销)事务:ROLLBACK TRANSACTION

一旦事务提交或回滚,则事务结束。

判断某条语句执行是否出错:

使用全局变量@@ERROR;

@@ERROR只能判断当前一条T-SQL语句执行是否有错,为了判断事务中所有T-SQL语句是否有错,我们需要对错误进行累计;如: SET @errorSum=@errorSum+@@error

9、了解事务的分类:

显示事务:用BEGIN TRANSACTION明确指定事务的开始,这是最常用的事务类型

隐性事务:通过设置SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开,下一个语句自动启动一个新事务。当该事务完成时,再下一个 T-SQL 语句又将启动一个新事务

自动提交事务:这是 SQL Server 的默认模式,它将每条单独的 T-SQL 语句视为一个事务,如果成功执行,则自动提交;如果错误,则自动回滚

10、使用事务解决银行转账问题

……关键语句讲解………

BEGIN TRANSACTION 

/*--定义变量,用于累计事务执行过程中的错误--*/

DECLARE @errorSum INT 

SET @errorSum=0  --初始化为0,即无错误

/*--转账:张三的账户少1000元,李四的账户多1000元*/

UPDATE bank SET currentMoney=currentMoney-1000

   WHERE customerName='张三'

SET @errorSum=@errorSum+@@error

UPDATE bank SET currentMoney=currentMoney+1000

   WHERE customerName='李四'

SET @errorSum=@errorSum+@@error  --累计是否有错误

IF @errorSum<>0  --如果有错误

  BEGIN

    print '交易失败,回滚事务'

    ROLLBACK TRANSACTION 

  END  

ELSE

  BEGIN

    print '交易成功,提交事务,写入硬盘,永久的保存'

    COMMIT TRANSACTION   

  END

GO

print '查看转账事务后的余额'

SELECT * FROM bank  

GO 

数据库事务的创建

数据库事务的创建

数据库事务的创建

数据库事务的创建

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢