跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 到底什么情况下需要使用 MySQL 事务?
未分類
1 9 月 2021

到底什么情况下需要使用 MySQL 事务?

到底什么情况下需要使用 MySQL 事务?

資深大佬 : wangbenjun5 10

众所周知,MySQL 事务具有原子性,当你需要对对张表同时进行操作的时候,为了保证要么都成功,要么都失败,必须使用事务机制。
但是仔细想想,举个例子 insert 操作,除非是 sql 语句写的有问题,正常情况下很难出错,除非是网络连接失败、数据库挂了、连接池满了等意外情况。这些都是极低概率事件。
然而如果同时操作的表不在一个库就操蛋了……所以去 tm 的事务,听天由命吧,大不了表里面多几条废数据,用什么事务!我不用了
大佬有話說 (50)

  • 資深大佬 : AngryPanda

    说的好!回去等通知。

  • 資深大佬 : leonme

    正常情况下很难出错,这……举个例子,目前各种分布式共识算法,不就是解决非正常情况下的问题的吗? 事物本质上是简化应用层的开发工作

  • 資深大佬 : hqs0417

    有些不一定是 SQL 语句的问题,可能是缺少必填字段,主键 /唯一键冲突。
    单库上使用事务可以降低系统复杂度。
    多库情况下就需要考虑最终一致了

  • 資深大佬 : ch2

    我给你转 100W,转账失败了
    你的钱没多,我的钱扣了
    凭空消失 100W 你说事务有啥意义?

  • 資深大佬 : Maboroshii

    保证原子性… select update 一串操作的时候 。 当然 还要配置隔离级别这种东西。。不过我也基本没咋用过事务..

  • 資深大佬 : falcon05

    啊?

  • 資深大佬 : zhaorunze

    可以不用事务,你可以只创建一个表,其他所有场景都往这个表堆字段,行与行之间不需要共享,就不需要事务了。

  • 資深大佬 : yianing

    账户的余额更改与流水创建必须在一个事务里面

  • 資深大佬 : Yadomin

    “意外情况”,“极低概率” 就意味着不用管了?

  • 資深大佬 : 11232as

    事务不是个技术问题,事务是跟业务强相关得…

  • 資深大佬 : SlipStupig

    事务是用来保证数据库操作时的一致性和完整性啊,原子操作也是用来保证一致性啊,数据之间是有关联的一些你觉得不重要的数据可能会产生连锁反应。
    比如:订单库存量,在条件竞争的情况下,可能导致库存数量为负数,在一些特定促销场景下然后导致订单爆单,这个时候公司就遭受了损失,这部分损失你愿意承担嘛?

  • 資深大佬 : Kilerd

    您说的对!

  • 資深大佬 : sadfQED2

    面试的时候需要使用事物

  • 資深大佬 : love

    too young 了
    你以为就写数据库会出错?你的程序不会抛异常?抛了异常要不要回滚?就这么留着写了一半的数据集?

  • 資深大佬 : sy20030260

    大部分垃圾代码就是「图个省事」带来的,写的人越省事,后续维护的人越蛋疼

  • 資深大佬 : Senorsen

    1L + 10086 哈哈哈哈哈
    你操作一次出现异常(比如网络错误)的概率假设是万分之一,十万次操作出现异常的概率是多少?更多次操作呢?
    图省事没有事务了,除非用户量很少不到几十几百个,否则用户资源状态不一致,全乱了,导致不可用,怎么办?事后处理修数据怕是都难。

  • 資深大佬 : seeker

    处理钱的时候。如果是个博客啥的,没了就没了把。

  • 資深大佬 : billlee

    开事务还提升性能啊,innodb 不开事务那其实就是每条语句 auto-commit, 每行写入语句都要刷盘

  • 資深大佬 : zhangxiaodao

    大多数时候,事务是和锁一起使用用来控制并发的。非并发情况,用或不用,都是业务对编码的容忍度要求。
    但是,小同志,你这个『大不了多几条废数据』的思想不能有啊,写代码还是要严谨,坏习惯不能养。

  • 資深大佬 : shiji

    哈哈,这就好比研究导弹干什么,搞一架客机+几组劳动人民从飞机往下一筐一筐扔手榴弹不就完了
    不过一个科技公司一旦高层技术人员都是这个思想,并对新来的 /严谨的人嗤之以鼻的话,基本离完蛋不差几年了。

  • 資深大佬 : EscYezi

    “丢了就丢了”……希望出生产事故的时候主还能这么想

  • 資深大佬 : yeqizhang

    标题就起的很唬人,正文又描述的其它

  • 資深大佬 : dayeye2006199

    我要是公司领导,我只想把 LZ 拖出去打屁屁

  • 資深大佬 : felixcode

    所以其它的可靠性设计在你这样的程序面前全都是个摆设,因为这样的程序在哪都是水桶的最短板。

  • 資深大佬 : yogogo

    多表操作的时候

  • 資深大佬 : paranoiddemon

    加事务代码量很大?

  • 資深大佬 : murmur

    这就是互联网思维,亲爱的用户我是你 X 爱用用不用拉倒,数据丢了就陪你点代金券就当无事发生

  • 資深大佬 : msaionyc

    希望以后不会遇到你这种同事

  • 資深大佬 : tabris17

    再过几年,你回过头来看当年发的这个帖子,你内心会有多尴尬呀
    当然,那时候你可能也已经转行了

  • 資深大佬 : pkoukk

    啧啧啧,我上大学的时候都问不出这种问题来。

  • 資深大佬 : cbasil

    例如商城里面优惠券使用,如果优惠券已经抵扣了,但是下单是因为用户账户问题下单失败,不用事务怎么处理优惠券还原的问题

  • 資深大佬 : sujin190

    恰恰多个操作不在同一个库才更需要事务,哥们,你搞反了

  • 資深大佬 : banmuyutian

    逆天

  • 資深大佬 : realpg

    主,你要是入职哪个第三方支付一定告诉我啊,我多注册接

  • 資深大佬 : heyjei

    你们其实没看到主的问题在哪。
    主的问题是一个 insert 语句还要用 begin transaction, commit 包起来,觉得很麻烦。主不知道的是单独的 sql 语句,数据库执行的时候是默认开始并在语句结束后自动提交事务的。

  • 資深大佬 : heyjei

    而我们所说的事务,一般都是指有很多个 sql 语句一起执行的时候,需要用事务包起来,要么全部执行,要么全部不执行。
    在这里触发事务回滚的不一定是 SQL 写错了,或者磁盘故障,或者网络故障,更多的时候,我们触发回滚都业务上的逻辑,比如转账的时候,先 sql 减去了一个人的钱,然后通过另外一个 sql 语句发现对方账号锁了,转不进钱,于是这里只需要回滚事务就可以了,不需要重新执行 sql 一步步的恢复现场。
    这只是一个简单的例子,数据库的事务远远不止这些。

  • 資深大佬 : heyjei

    善用事务,可以极大的简化和优化你的业务逻辑代码

  • 資深大佬 : kenvix

    先不说别的,姑且问一句写过存储过程吗

  • 資深大佬 : darkengine

    是否需要提桶跑路 = 调用次数 * 故障发生概率 * 故障后果
    由此可知,不能因为“故障发生概率低”就不管

  • 資深大佬 : Felldeadbird

    insert 语句也会出错啊。假定你某个 SQL 不稳定,导致一直 sleep 。这时候你 insert 就 wait 状态。你没事务的话,等 wait 结束后,他插入了数据。

  • 資深大佬 : tairan2006

    、主脑子里没有并发的概念么

  • 資深大佬 : sakasaka

    防止安全事故还有就是简化代码逻辑

  • 資深大佬 : zxcslove

    就发泄情绪呗,谁还没个情绪了,哈哈哈

  • 資深大佬 : chendy

    看了下主的历史发帖,细思极恐

  • 資深大佬 : qwe520liao

    事务改善了人们的生活,让我们可以用一个简单的编程模型来屏蔽底层的不确定性,这本身就是一个很伟大想法,但是要善用,很多情况下,问题不在于客观事物本身,而在于人。

  • 資深大佬 : Chinsung

    首先开个事务对代码要求也不高吧,在 Spring 加个注解就完事了。分布式事务另说。
    其次就是,开不开事务对你实际执行的速度,影响应该没有想象中的大吧?
    在多条 sql 的情况下,使用很小的代价就可以获得原子性等等等特性,有啥麻烦的?

  • 資深大佬 : goodboy95

    我的系统,有些功能前前后后要改十几次数据,没事务会死的

  • 資深大佬 : ninglg

    如果只需要考虑正常情况,那程序的世界就太美好了

  • 資深大佬 : zoyua

    呃,事务还是很重要的

  • 資深大佬 : xipushi

    我碰到 java 代码里面, 基本不需要特别关心事务提交。
    同事写了个事务+异步的代码,查了我大半天
    “`
    @Transactional
    methodA(){
    Object a = reponsitory.save();
    async methodB(a.id) //异步调用
    …..
    //若干操作
    }
    methodB(id){
    reponsitory.findById(id) // 这里偶尔查不到数据
    }
    “`

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具