众所周知,MySQL 事务具有原子性,当你需要对对张表同时进行操作的时候,为了保证要么都成功,要么都失败,必须使用事务机制。

但是仔细想想,举个例子 insert 操作,除非是 sql 语句写的有问题,正常情况下很难出错,除非是网络连接失败、数据库挂了、连接池满了等意外情况。这些都是*低概率事件。

然而如果同时操作的表不在一个库就操蛋了……所以去 tm 的事务,听天由命吧,大不了表里面多几条废数据,用什么事务!我不用了
第 1 条附言 · 21 小时 52 分钟前
纯属吐槽,我的意思是一些不太重要的业务可以不用,图个省事,特别是那种跨库的写表操作,丢了也就丢了,如果涉及订单、金额等重要业务确实使不得,分布式事务也得上
第 2 条附言 · 19 小时 59 分钟前
各位大佬说的对,然而我就是不喜欢用事务,哈哈,哪天出 bug 找我我再修复 bug,这样工作量就上来了
事务 MySQL 原子性 insert44 条回复 • 2021-09-02 16:10:04 +08:00
AngryPanda 1
AngryPanda 22 小时 41 分钟前 ❤️ 22
说的好!回去等通知。
leonme 2
leonme 22 小时 36 分钟前 via iPhone
正常情况下很难出错,这……举个例子,目前各种分布式共识算法,不就是解决非正常情况下的问题的吗? 事物本质上是简化应用层的开发工作
hqs0417 3
hqs0417 22 小时 35 分钟前
有些不一定是 SQL 语句的问题,可能是缺少必填字段,主键 /唯一键冲突。
单库上使用事务可以降低系统复杂度。

多库情况下就需要考虑*终一致了
ch2 4
ch2 22 小时 33 分钟前
我给你转 100W,转账失败了
你的钱没多,我的钱扣了
凭空消失 100W 你说事务有啥意义?
Maboroshii 5
Maboroshii 22 小时 33 分钟前
保证原子性… select update 一串操作的时候 。 当然 还要配置隔离级别这种东西。。不过我也基本没咋用过事务..
falcon05 6
falcon05 22 小时 31 分钟前 via iPhone
啊?
zhaorunze 7
zhaorunze 22 小时 28 分钟前
可以不用事务,你可以只创建一个表,其他所有场景都往这个表堆字段,行与行之间不需要共享,就不需要事务了。
yianing 8
yianing 22 小时 26 分钟前 via Android
账户的余额更改与流水创建必须在一个事务里面
Yadomin 9
Yadomin 22 小时 26 分钟前
“意外情况”,“*低概率” 就意味着不用管了?
11232as 10
11232as 22 小时 22 分钟前 ❤️ 2
事务不是个技术问题,事务是跟业务强相关得…
SlipStupig 11
SlipStupig 21 小时 26 分钟前
事务是用来保证数据库操作时的一致性和完整性啊,原子操作也是用来保证一致性啊,数据之间是有关联的一些你觉得不重要的数据可能会产生连锁反应。
比如:订单库存量,在条件竞争的情况下,可能导致库存数量为负数,在一些特定促销场景下然后导致订单爆单,这个时候公司就遭受了损失,这部分损失你愿意承担嘛?
Kilerd 12
Kilerd 21 小时 17 分钟前
您说的对!
sadfQED2 13
sadfQED2 21 小时 15 分钟前 via Android
面试的时候需要使用事物
love 14
love 21 小时 0 分钟前
too young 了
你以为就写数据库会出错?你的程序不会抛异常?抛了异常要不要回滚?就这么留着写了一半的数据集?
sy20030260 15
sy20030260 20 小时 38 分钟前
大部分垃圾代码就是「图个省事」带来的,写的人越省事,后续维护的人越蛋疼
Senorsen 16
Senorsen 20 小时 2 分钟前
1L + 10086 哈哈哈哈哈

你操作一次出现异常(比如网络错误)的概率假设是万分之一,十万次操作出现异常的概率是多少?更多次操作呢?
图省事没有事务了,除非用户量很少不到几十几百个,否则用户资源状态不一致,全乱了,导致不可用,怎么办?事后处理修数据怕是都难。
seeker 17
seeker 19 小时 29 分钟前
处理钱的时候。如果是个博客啥的,没了就没了把。
billlee 18
billlee 19 小时 21 分钟前 ❤️ 1
开事务还提升性能啊,innodb 不开事务那其实就是每条语句 auto-commit, 每行写入语句都要刷盘
zhangxiaodao 19
zhangxiaodao 18 小时 14 分钟前
大多数时候,事务是和锁一起使用用来控制并发的。非并发情况,用或不用,都是业务对编码的容忍度要求。

但是,小同志,你这个『大不了多几条废数据』的思想不能有啊,写代码还是要严谨,坏习惯不能养。
shiji 20
shiji 18 小时 0 分钟前
哈哈,这就好比研究导弹干什么,搞一架客机+几组劳动人民从飞机往下一筐一筐扔手榴弹不就完了

不过一个科技公司一旦高层技术人员都是这个思想,并对新来的 /严谨的人嗤之以鼻的话,基本离完蛋不差几年了。
EscYezi 21
EscYezi 15 小时 42 分钟前 via iPhone
“丢了就丢了”……希望出生产事故的时候楼主还能这么想
yeqizhang 22
yeqizhang 15 小时 17 分钟前 via Android
标题就起的很唬人,正文又描述的其它
dayeye2006199 23
dayeye2006199 15 小时 6 分钟前
我要是公司领导,我只想把 LZ 拖出去打屁屁
felixcode 24
felixcode 14 小时 28 分钟前
所以其它的可靠性设计在你这样的程序面前全都是个摆设,因为这样的程序在哪都是水桶的*短板。
yogogo 25
yogogo 9 小时 40 分钟前
多表操作的时候
paranoiddemon 26
paranoiddemon 9 小时 21 分钟前 via Android
加事务代码量很大?
murmur 27
murmur 8 小时 41 分钟前
这就是互联网思维,亲爱的用户我是你 X 爱用用不用拉倒,数据丢了就陪你点代金券就当无事发生
msaionyc 28
msaionyc 8 小时 4 分钟前
希望以后不会遇到你这种同事
tabris17 29
tabris17 7 小时 51 分钟前 via iPhone ❤️ 3
再过几年,你回过头来看当年发的这个帖子,你内心会有多尴尬呀

当然,那时候你可能也已经转行了
pkoukk 30
pkoukk 7 小时 48 分钟前
啧啧啧,我上大学的时候都问不出这种问题来。
cbasil 31
cbasil 7 小时 35 分钟前
例如商城里面优惠券使用,如果优惠券已经抵扣了,但是下单是因为用户账户问题下单失败,不用事务怎么处理优惠券还原的问题
sujin190 32
sujin190 6 小时 51 分钟前
恰恰多个操作不在同一个库才更需要事务,哥们,你搞反了
banmuyutian 33
banmuyutian 6 小时 41 分钟前
逆天
realpg 34
realpg 6 小时 14 分钟前 ❤️ 1
楼主,你要是入职哪个第三方支付一定告诉我啊,我多注册接
heyjei 35
heyjei 5 小时 52 分钟前 via Android
你们其实没看到楼主的问题在哪。

楼主的问题是一个 insert 语句还要用 begin transaction, commit 包起来,觉得很麻烦。楼主不知道的是单独的 sql 语句,数据库执行的时候是默认开始并在语句结束后自动提交事务的。
heyjei 36
heyjei 5 小时 44 分钟前 via Android
而我们所说的事务,一般都是指有很多个 sql 语句一起执行的时候,需要用事务包起来,要么全部执行,要么全部不执行。

在这里触发事务回滚的不一定是 SQL 写错了,或者磁盘故障,或者网络故障,更多的时候,我们触发回滚都业务上的逻辑,比如转账的时候,先 sql 减去了一个人的钱,然后通过另外一个 sql 语句发现对方账号锁了,转不进钱,于是这里只需要回滚事务就可以了,不需要重新执行 sql 一步步的恢复现场。

这只是一个简单的例子,数据库的事务远远不止这些。
heyjei 37
heyjei 5 小时 42 分钟前 via Android
善用事务,可以*大的简化和优化你的业务逻辑代码
kenvix 38
kenvix 5 小时 38 分钟前
先不说别的,姑且问一句写过存储过程吗
darkengine 39
darkengine 4 小时 40 分钟前
是否需要提桶跑路 = 调用次数 * 故障发生概率 * 故障后果

由此可知,不能因为“故障发生概率低”就不管
Felldeadbird 40
Felldeadbird 3 小时 37 分钟前
insert 语句也会出错啊。假定你某个 SQL 不稳定,导致一直 sleep 。这时候你 insert 就 wait 状态。你没事务的话,等 wait 结束后,他插入了数据。
tairan2006 41
tairan2006 3 小时 4 分钟前
、楼主脑子里没有并发的概念么
sakasaka 42
sakasaka 3 小时 3 分钟前
防止安全事故还有就是简化代码逻辑
zxcslove 43
zxcslove 3 小时 1 分钟前
就发泄情绪呗,谁还没个情绪了,哈哈哈
chendy 44
chendy 1 小时 15 分钟前
看了下楼主的历史发帖,细思*恐