mysql - 如果不使用事务是否会造成个别数据插入失败的情况呢?
天蓬老师
天蓬老师 2017-04-17 13:37:40
[MySQL讨论组]
  • 如果不使用事务是否会造成个别数据插入失败的情况呢?

  • MyisAM 和 innoDB 分别说下

我考虑的是如果不需要使用事务,那么我就把表结构使用MyisAM的,这样效率会高一些

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(2)
PHP中文网

事务是用来确保你插入的原子性的,不是用来确保成功率的

比如说,你现在是一个电商系统,有用户的订单表和商品表,现在用户下单了,你要先插入订单表然后同时更新商品库存量-1(并且商品库存不能<0)

insert into user_order XXXXXX;
update goods set inventory = inventory - 1 where goods_id = XXX and inventory > 0;

这时候你就得用事务,也就是确保订单创建和更新商品余量必须同时都成功,或者都失败(比如没有余量了),并且在失败时妥善告知客户商品卖完了。如果不使用事务,这个场合下有可能会产生脏数据,就是订单创建出来了,但是库存量没有-1(因为刚好别的用户买走了另一个),就造成了事实上的超售

至于数据库插入失败的情况各种多,比如说连接断开了,磁盘写满了,连接数过多导致响应缓慢,超时等等,这些是事务所无法应对的

最后MyISAM并不支持事务


补充回答评论中的问题

MyISAM和InnoDB选择哪个是个经典问题,但是归根结底其实是一句话,要看你的具体使用场景。

从整体来说,如果你的MySQL足够新(5.6以及以上),我建议你还是使用InnoDB,特别是对于大量写入的表尤其是如此,另外如果你有批量insert和update,你可以获得事务带来的极大的提升的性能的好处

InnoDB的优势领域:较多主键查询,索引,需要行锁,写入频繁,需要用到外键,当然还有事务
MyISAM的优势领域:5.6以前的MySQL版本全文索引,count很快,大部分情况下只有select的只读表(其实随着MySQL的版本迭代和InnoDB的完善,它的领域已经越来越小)

天蓬老师

插入失败与你是否开启事务没有关系,比如你现在有一条记录为<1,'hello'>,其中1代表id,是主键,此时试图insert一条新的记录<1,'world'>,不管你是否包裹在一个显式事务中,本次插入都会失败(主键冲突)。所以正如vimac所说的,事务是用来保证all or nothing语义的,不是保证成功性的。此外,目前官方默认的引擎就是InnoDB了,而不是MyIsam了,很显然前者是更为推荐的选择

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号