突然想到一个问题,mysql中我们经常用到事务,比如一次向几张表插入内容,如果中间出错了可以回滚,但是实际开发中,像这种一次可能向多个数据表写入数据的情况,并没有采用事务。

 

比如一件商品表单,有商品基本信息,商品sku(颜色尺寸价格库存),商家信息,店铺信息,提交的时候是向不同的表插入或更新数据,并且都是等第一张表插入(或更新)完了,然后第二张表,第三张表。。。

如果中间某个过程突然中断了,只向前一张表成功插入了数据,而后面的程序没有执行,不怕出现这种情况吗?

再比如,文章表一般设计两张表,一张文章基本信息表,一张文章详情表,大内容放详情表,插入和读取数据也是分两步,也一般不用事务。

我用到事务的一个地方是在一个广告联盟系统,根据接口数据计算广告费用并记录到广告报表,同时更新记录到用户收益表,年统计表等,用了事务,中间某个过程出错就回滚。

为什么有的地方用事务,有的地方不用事务,使用事务的场景是什么?

以下是V2EX网友的回答节选:

lianyue:设计金额 方便 或对数据准确性要求特稿 并且是多表才需要事务 需要的地方很少很少
1 商品 插入优先 基本信息 然后 扩展信息 插入基本信息后才插入扩展信息 比如 颜色尺寸 插入失败大不了 没库存 重新编辑下就好了 失败率很低很低的

2 文章也是 大不了文章没内容

3 广告联盟 广告报表 可以直接用计划任务 定时统计下就好了 每次有浏览都更新2个表么
比如每天凌晨后统计昨天的数据 看今天的数据直接 count 查询统计就好了 不需要事务

kchum:OLTP(On_line Transaction Processing 联机事务处理) 和 OLAP(OLAP:On_line Analytical Processing 联机分析处理) 的区别。
关于银行金融,特别是涉及金钱的,当然要用事务。
按照范式来说,确定应该保持数据的一致性,原子性。
但我们在项目中为了性能,或者其他因素(lan)还不是严格对待。
以上是我的见解

我的理解是:比如一篇文章标题、作者等基本属性在一张表,内容等其他的在另一张表,填好表单提交的时候,不会因为第二张表没有插入数据而影响到后面的数据添加,就算内容没有发出去,可以在后台重新编辑保持即可。但是涉及到非常重要的领域,如金融,或者不能再次重新编辑的情况,要使用事务严格控制流程。