首页 > 如果不使用事务是否会造成个别数据插入失败的情况呢?

如果不使用事务是否会造成个别数据插入失败的情况呢?

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


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


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

比如说,你现在是一个电商系统,有用户的订单表和商品表,现在用户下单了,你要先插入订单表然后同时更新商品库存量-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的完善,它的领域已经越来越小)

【热门文章】
【热门文章】