关于数据库事物和锁的理解

soamu 2020-02-06 10:08:46
最近在研究数据库事物,理解在事物内同时执行多条语句,要么都执行要么都不执行,已保证数据的完整性。

可是如果不用事物的话,我们同样能做到数据的完整性啊。比如:订单表和订单明细表和用户积分需要同步进行。

if(insert into.....[订单表]......)
{
if(insert into [订单明细表]......)
{
update [用户积分]......
}


}

这样写也一样能保证数据的完整性,那么为什么要用事物呢?
...全文
228 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2020-02-07
  • 打赏
  • 举报
回复
引用 5 楼 soamu 的回复:
[quote=引用 2 楼 吉普赛的歌 的回复:] if 后面大部分情况是是接 select 查询, 不是 insert. 按你的做法 如果在执行第二步时, 第一步的条件被人家改动了, 那你怎么处理? 事务本身来说, 是要加锁的, 限制一小段时间内数据不准任意改动, 以完成一个重要的任务。 拿最典型的银行转账来说: 你要转1千元给你父亲, 第一步你先查询你账上有没有1千元,有进入第二步转账。 第一步查得你有2千元,可以转,但刚进入第二步,没有设置事务保护,你女友拿你银行卡在ATM上取了3千,然后你也转账成功了。 最后你银行账户的余额是多少?负2千? 这样银行还能开下去么? 明白了吧?
是不是事务内的语句不执行完,其他用户不允许其他用户下一步操作呢?如果操作了会有什么结果?[/quote] 是的,此时数据库里你正在操作的事务对应的那些记录被锁定,其它用户无法操作,操作了也只能排队等。 还是拿前面的那个案例来说。用事务的情况下: 你已经完成事务的第一步,进入到第二步转账。 你女友要取款,只能排队等你转账完。 等你转账完毕,其实她已经无法取款,因为钱不够了,但这才是事实。
  • 打赏
  • 举报
回复
搞上事务就跟你去ATM机取钱,你进去把门锁上,另外个人想取钱,只能等你取完把门锁打开,才能轮得到他
soamu 2020-02-07
  • 打赏
  • 举报
回复
引用 1 楼 LvBao_117 的回复:
假如,如下红色if是假呢? if(insert into.....[订单表]......) { if(insert into [订单明细表]......) { update [用户积分]...... } } 是不是需要撤销“insert into.....[订单表]......”的操作
在并发下,是不是事务内的操作不完成,其他用户就不能读取或者修改呢?
soamu 2020-02-07
  • 打赏
  • 举报
回复
引用 2 楼 吉普赛的歌 的回复:
if 后面大部分情况是是接 select 查询, 不是 insert. 按你的做法 如果在执行第二步时, 第一步的条件被人家改动了, 那你怎么处理? 事务本身来说, 是要加锁的, 限制一小段时间内数据不准任意改动, 以完成一个重要的任务。 拿最典型的银行转账来说: 你要转1千元给你父亲, 第一步你先查询你账上有没有1千元,有进入第二步转账。 第一步查得你有2千元,可以转,但刚进入第二步,没有设置事务保护,你女友拿你银行卡在ATM上取了3千,然后你也转账成功了。 最后你银行账户的余额是多少?负2千? 这样银行还能开下去么? 明白了吧?
是不是事务内的语句不执行完,其他用户不允许其他用户下一步操作呢?如果操作了会有什么结果?
  • 打赏
  • 举报
回复
像这个要发财了
吉普赛的歌 2020-02-06
  • 打赏
  • 举报
回复
说得有一点问题。 你女友取款,也是 第一步查你账上有没有2千, 有再进入第二步取款。 最后余额是 负1 千。
吉普赛的歌 2020-02-06
  • 打赏
  • 举报
回复
if 后面大部分情况是是接 select 查询, 不是 insert. 按你的做法 如果在执行第二步时, 第一步的条件被人家改动了, 那你怎么处理? 事务本身来说, 是要加锁的, 限制一小段时间内数据不准任意改动, 以完成一个重要的任务。 拿最典型的银行转账来说: 你要转1千元给你父亲, 第一步你先查询你账上有没有1千元,有进入第二步转账。 第一步查得你有2千元,可以转,但刚进入第二步,没有设置事务保护,你女友拿你银行卡在ATM上取了3千,然后你也转账成功了。 最后你银行账户的余额是多少?负2千? 这样银行还能开下去么? 明白了吧?
LvBao_117 2020-02-06
  • 打赏
  • 举报
回复
假如,如下红色if是假呢?
if(insert into.....[订单表]......)
{
if(insert into [订单明细表]......)
{
update [用户积分]......
}
}

是不是需要撤销“insert into.....[订单表]......”的操作

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧