java,.net,php等的web应用,例如一个操作中会对数据库某表进行写入,另一个操作会对这张表被写入的列进行查询,而在多个对这2操作的并发请求下,自己写的代码层面不做任何措施会不会出问题呢(就是像java,.net,php这些中的web开发框架会不会已处理好这种情况,程序员使用框架的时候可以不用考虑这方面的问题)?
对于并发处理,框架虽然有一定的便利,但是还是需要人工去操作的,像spring提供了事务管理,在错误情况下可以回滚,但是具体的判断需要自己写,其次像多并发,有乐观锁和悲观锁.........其次还有权限管理,像一些小项目的话可能并不太关注这方面,但是如果一个大项目就会接触到很多这些东西。
所以可以去看看 spring事务管理 权限管理,并发处理等相关的知识
数据库本身有一些机制处理这个问题,就是所谓的锁,以Mysql数据库为例,insert跟select实际上互相不冲突,
基本是按先来后到的顺序进行处理,但是当两个update同时发生在一条数据的时候就会有所谓的锁,
这个还得看你使用哪种数据库引擎,常见的MyISAM这种情况会造成表锁,也就是第一条数据在update之前,
mysql会锁表,这个锁表期间其他的请求会自动等待,等update完成的时候进行解锁,如果是InnoDB引擎只会行锁,
这时候除了正在被update的数据以外,其他数据是正常可以操作的,以上行为都是数据库自动不需要人为干预,
但是还有一种情况是InnoDB支持事务处理,也就是说程序可以先start transaction然后连续处理多张表,
当全部都成功的情况下,使用coomit确认,如果期间有一个失败可以用rollback滚回,以取消有问题的数据,
在transation期间,所有的操作都是有锁的,但是会有一种死锁现象,
就是当1号程序进行start transation操作A表跟B表 而2号程序也进行start transation先操作B在操作A表,
如果刚好1号程序操作 A表完发现B表锁表 2号程序先操作B表发现A表被锁,这时候就发生死锁,
因为两个程序都在等待对方解锁,但是都无法完成,而MySQL也针对这种情况,有一种处理的机制,
会将后操作的失败滚回,让先操作的完成,写程序的时候只需要判断返回成功或失败,分别处理后续的处理流程即可