高并发测试下的一些问题及解决[1]

发表于:2010-03-18来源:作者:点击数: 标签:解决
高并发测试下的一些问题及解决[1] 软件测试工具 测试在 sql server2000 上进行,对工作流操作的相关方法在 单元测试 里进行多线程并发。测试发现sqlserver出现死锁的情况相当多,一些典型的情况: 1、对同一张表先insert再update是很快会引起死锁的,不管操

  高并发测试下的一些问题及解决[1] 软件测试工具

  测试在sqlserver2000上进行,对工作流操作的相关方法在单元测试里进行多线程并发。测试发现sqlserver出现死锁的情况相当多,一些典型的情况:

  1、对同一张表先insert再update是很快会引起死锁的,不管操作的是否是同一记录

  解决方法:对于同一记录,需要调整hibernate的映射策略,使得一次insert完成操作。对于不同的记录需要在代码中手动flush,使得update先于insert。

  2、对两张表进行多次update操作时,两张表交替update也会很快引起死锁

  解决方法:在代码中手动flush,保证对两张表的update不会出现交替的情况。

  3、部分大范围扫描的select和update混合也会导致死锁

  解决方法:优化sql,尽量减少sql语句,通过给po增加持久化字段的方式减少关联查询

  经过优化,大部分情况下数据库死锁的情况得以避免,另外奇怪的是通过事件探查器在死锁时并未发现锁升级的事件。但是在一些特殊情况下(例如多个并发汇聚的直接联合),死锁依旧发生。最后不得不对方法进行synchronized关键字同步,这个通过synchronized flush完成。业务方法不必同步,最后批量操作数据库时进行同步。

  换oracle进行测试,在未synchronized的情况下,未发生死锁情况。由此可见sqlserver与oracle锁实现机制存在很大的差别。另,同事说,sqlserver2005性能和机制发生了很大的变化,未测试。软件测试 

   补充一下我的一个最简单情况下的测试用例: PO:

  view plaincopy to clipboardprint?

  public class TestPO {

  String id;

  String name;

  int num;

  ....

  }

  public class TestPO {

  String id;

  String name;

  int num;

  ....

  }映射文件 hibernate3: view plaincopy to clipboardprint?

原文转自:http://www.ltesting.net