SQL Server事务详细解析

作者:袖梨 2026-07-27

SQL Server事务是数据库操作的逻辑工作单元。

1、 根据图示说明,创建一个新的存款表格。

2、 包含两位用户,各自拥有ID、姓名及相应余额信息。

3、 查询表_存款中的所有数据信息

img_6a66cad831bd630.webp

4、 假设一下现在的情况。

5、 李冬冬向黄少明借一千元。

6、 如何用SQL语句实现这一操作?

img_6a66cad831bdb31.webp

7、 将表_存款中id为1的记录余额减去1000。

8、 将表_存款中id为2的记录余额增加1000元。

9、 查询表_存款中的所有数据

10、 这些SQL语句我们之前都学过。

11、 从id1账户扣除1000元。

12、 将id2的余额增加1000元。

13、 如果李冬冬再次向黄少明借款五千元,又该如何处理?

14、 结果出现负数,实在不合常理。

15、 余额字段应设置为不低于零。

img_6a66cad831bde32.webp

16、 进入设计表界面,选择添加CHECK约束选项。

17、 该设置确保余额列在增改时数值不得低于零。

18、 保存并关闭表结构修改后,该约束即刻生效。

img_6a66cad831be033.webpimg_6a66cad831be234.webp

19、 恢复原表数据后重新执行转账,观察结果。

img_6a66cad831be435.webp

20、 再尝试转账五百元,看看情况如何。

21、 错误消息547,严重级别16,状态0,位于第一行。

22、 数据库geek的dbo.表_存款表中,余额列的值在执行UPDATE语句时违反了余额>=0的CHECK约束,导致操作失败。

23、 已终止语句。

24、 1 行已更新

img_6a66cad831be736.webp

25、 提示出现后,减少5000操作失败,但增加5000的操作成功完成。

26、 这种情况确实存在风险,现实中银 行若出现类似问题将带来严重后果。

img_6a66cad831be937.webp

27、 此时需引入事务概念,以有效解决此类问题。

28、 事务指的是一组操作。

29、 需要同时完成多项任务,且全部必须成功;只要其中任意一项失败,此前所有成果都将作废。

30、 例如,首先需从id1卡中扣除5000元。

31、 请将id2卡余额充值至5000元。

32、 两件事须在事务中同时成功方为有效。

33、 若某操作失败,则视为无效,系统将数据全部回滚至操作前状态。

34、 一手交钱,一手交货,简单直接明了。

35、 必须全部成功或全部失败,绝不允许部分成功部分失败。

36、 恢复之前的数据即可。

img_6a66cad831beb38.webp

37、 在SQL Server中,默认情况下每个SQL语句都会被视为一个独立事务。

38、 事务确保数据操作的完整与安全。

39、 起初,人们更青睐SQL Server和Oracle,对MySQL则兴趣寥寥。

40、 早期MySQL版本缺乏事务支持功能。

41、 开始事务处理,启动数据库操作的事务流程。

42、 提交事务操作,完成数据变更的持久化处理。

43、 回滚事务操作,撤销未提交的数据更改。

44、 事务核心在于三个关键词。

45、 在处理多项任务前先开启事务,如同游戏中的存盘点,确保操作可回溯与一致性。

46、 若所有操作均顺利完成,则提交事务,数据库中的数据才会正式生效。

47、 一旦出错便回滚事务,恢复至游戏的保存进度。

48、 开启事务,对ID1执行加10000操作。

49、 再查一次

img_6a66cad831bed39.webp

50、 发现id1账户余额增加一万,但该笔交易尚未完成。

51、 该数据仅暂存于单一位置,须完成回滚或提交操作后方可视为最终结束。

img_6a66cad831bf0310.webp

52、 回滚事务后重新查询,数据恢复至先前状态。

53、 如此一来,此事便有始有终了。

54、 若决定提交事务,系统将永久保存此次操作的所有更改。

55、 该事务已正式写入数据库,成为持久化数据,不再仅是临时存储。

56、 他人便能真正查询到相关信息。

img_6a66cad831bf2311.webp

57、 在SQL Server中,我们用SQL语句完整实现了该过程。

58、 先声明一个变量。

59、 每次执行,数值自动累加。

60、 若结果为2则提交,否则回滚事务。

61、 接着查看结果,保持不变,再尝试修改为2000。

62、 声明一个整型变量用于记录受影响的行数。

63、 将表_存款中id为1的记录余额减去2000。

64、 将上一条语句影响的行数赋值给变量@影响行。

65、 将表_存款中id为2的记录余额增加2000元。

66、 将上一条语句影响的行数累加到变量@影响行中。

67、 如果影响行数等于2

68、 查询表_存款中的所有数据。

img_6a66cad831bf4312.webp

69、 转账已完成

img_6a66cad831bf6313.webp

70、 事务涉及一个方面

71、 共享读锁

72、 独占锁(增删改)

73、 事务相关内容已介绍完毕,更多细节可参考MSDN了解事务隔离级别。

相关文章

精彩推荐