透明 发表于 2015-1-16 14:07:10

削减数据库逝世锁的8种办法

在JOIN操作中(需要从多个数据表提取数据时),MySQL只有在主键和外键的数据类型相同时才能使用索引。从客不雅上讲,在年夜型数据库使用体系中,逝世锁成绩不成能完整制止的。可是如我们有优秀的编码习气与认识,完整能够只管削减逝世锁情形的产生,从而进步使用程序功能。

上面我们解说一下在年夜型数据库体系开辟过程当中应当注重的8个方面:
1,只管不要在一个事件中完成过于庞大的查询或更新操纵。缘故原由很复杂,越是庞大的数据库操纵,占用数据库资本的工夫越长,激发逝世锁的大概性越年夜。

2,只管不要在数据库事件中请求用户呼应。缘故原由同1,这也会招致事件长工夫没法停止,华侈数据库材料。

3,逝世锁是因为并发会见数据库资本酿成的,削减逝世锁就应当限定使用体系的并发会见量。我们应当公道设置背景服务的线程数,将大批数据的操纵分化,分步骤,分阶段的实行。也应当制止在用户量年夜的时分年夜范围的举行背景数据库操纵,应当将年夜范围的数据库操纵放在用户量起码的时分举行。

4,尽量以分区表或分区视图的体例拆分包括大批数据的表,将它们保留在分歧的物量磁盘和文件组中。在会见数据时,能够分离会见保留在分歧分区的数据,从而削减由于在年夜型表中安排锁而形成别的事件长工夫守候的几率。

5,只管制止利用占用很长的庞大查询,在前提同意的情形下应当只管利用分页查询或减少了局集的体例。由于庞大查询会长工夫占用数据库资本,增添产生逝世锁的几率。

6,尽量利用较低的断绝级别,如READUNCOMMITTED,由于断绝级别低时,事件之间互相守候的情形会削减,如许每一个事件城市尽量快地完成数据库操纵,然后开释其具有的锁资本,如许就会下降呈现锁守候或逝世锁的几率。固然,用户在计划数据库使用程序时,必要思索怎样办理事件中数据纷歧致的情形。

7,应当注重一致会见表的按次,只管制止有的事件先查询表A然后更新表B,而有的事件先查询表B再更新表A的情形。

8,假如一个事件中只举行读取数据的操纵,则能够在该事件中利用快照(SNAPSHOT)断绝级别。由于在快照断绝级别中,数据库引擎不会堵塞其他事件对以后事件所占用资本的修正操纵,以后事件会以为它所具有的资本没有被修正过(实践上它所具有的资本是一个快照)。如许就能够削减由于守候资本而发生逝世锁的情形。虽然可以将一个droptable语句转换成先delete再删表,性能却会降低很多。这里我们用上面说道的另外一种可用数据:“操作前数据备份”。

飘飘悠悠 发表于 2015-1-18 12:04:11

一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)

第二个灵魂 发表于 2015-1-25 22:50:22

微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。

深爱那片海 发表于 2015-2-4 13:11:17

是要和操作系统进行Socket通讯的场景。否则建议慎重!

乐观 发表于 2015-2-9 23:09:38

再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SETNULL和SETDEFAULT属性,能够提供能好的级联设置。

因胸联盟 发表于 2015-2-28 04:30:27

同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。

简单生活 发表于 2015-3-9 21:06:26

而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。

金色的骷髅 发表于 2015-3-23 15:53:49

总感觉自己还是不会SQL
页: [1]
查看完整版本: 削减数据库逝世锁的8种办法