1. 多个方法,操作同一张表的,统一操作该表的方法,更新此表用同一个方法,方法内使用多线程锁/分布式锁
2. 一次操作,操作多个表,每个模块统一操作顺序
3. 不要在循环里 调用写数据库的操作
4. 查询用with(nolock), 修改、删除(update\delete) where条件匹配主键
非聚集索引:UPDATE 可以走行级锁, WHERE条件不是主键或者索引, 即使强制走行级锁也走不了行级锁
错误示例:
a. delete from 表名 where id = 'xxx' and autoid not in ('1','2','3') , not in 会导致全表锁
b. delete from 表名 where id like '%xxx' , like '%xxx' 不会走索引
5. 查询一张表的方法,最好统一方法,以保证where条件 字段顺序一致
6. 一个线程里,操作多张表 ,统一用一个数据库连接对象
7. 不同线程之间减少共用资源,例如,过程表 用临时表,而不用物理表
8. 最小事务原则
9. 最小锁原则,线程锁、行锁;
10. 批量原则,从数据库里一次取一批,不要每次重新取
11. 不受事务控制的方法,不能穿插在锁分配过程中
例如:调用SAP接口,要么放在 数据库加锁操作前,要么放在数据库加锁操作后
12. 禁用 TranscationScope,这个分布式事务 效率极低,在大并发下还经常发生莫名其妙的错误