我有一个托管在Web服务器上的MySql数据库,它有一组包含数据的表。我正在分发使用HTML5 / Javascript / CS3构建的前端应用程序。
现在当多个用户同时尝试在其中一个表中插入/更新时会产生冲突,还是会自动处理表的锁定,例如当一个用户使用时,它将为他锁定表,然后让用户完成后让其余的跟在队列中将释放锁,然后将其提供给队列中的下一个?这是否会发生,或者我需要在mysql数据库中处理这个案例
实施例
当用户想要插入数据库时,他调用位于web服务器上的php文件,该文件具有insert命令以将数据发布到数据库中。我担心如果两个或更多人同时插入它将进行更新。
mysqli_query($con,"INSERT INTO cfv_postbusupdate (BusNumber, Direction, StopNames, Status, comments, username, dayofweek, time) VALUES (".trim($busnum).", '".trim($direction3)."', '".trim($stopname3)."', '".$status."', '".$comments."', '".$username."', '".trim($dayofweek3)."', '".trim($btime3)."' )");
答案 0 :(得分:1)
MySQL自动处理表锁定。
请注意,使用MyISAM引擎时,整个表都会被锁定,并且语句将阻止("排队")等待锁定被释放。
InnoDB引擎提供了更多的并发性,可以进行行级锁定,而不是锁定整个表。
在某些情况下,如果要维护参照完整性,可能需要对多个MyISAM表进行锁定,并且您希望禁止其他会话在会话执行时对其他任何表进行更改工作。但是,这真的杀死了并发性;这应该更像是一个" admin"类型函数,并不是并发应用程序应该做的事情。
如果您正在使用事务(InnoDB),那么您的应用程序需要处理的问题是表中锁定行的顺序;应用程序可能会遇到“死锁”#34;例外情况,当MySQL检测到有两个(或更多)事务无法继续,因为每个事务都需要获取另一个持有的锁。 MySQL可以做的唯一事情是检测到这一点,MySQL可以做的唯一恢复就是选择其中一个事务作为受害者,这将是将导致死锁的事务"异常,因为MySQL杀了它,允许至少一个事务继续进行。