sql一般不要显示加锁,因为难排查和调试,
1 使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务;
2 设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂;
3 优化程序,检查并避免死锁现象出现;
4 .对所有的脚本和SP都要仔细测试,减小锁的粒度,表锁、行锁
5 一般不要修改SQL SERVER事务的默认级别。不推荐强行加锁
6.应用程序代码 sql一般不要显示加锁,如果需要使用锁时,可考虑事务方式。
7.特殊加锁的,需经dba确实,一般编写成sp,程序中显锁很难控制
8.都需要错误处理IF @@ERROR!=0 ROLLBACK TRAN;
9.不使用lock的尽量不使用lock,不使用事务的尽量不使用事务,除非没有事务导致错误
10.事务不能太大,3B:大sql,大批量、大事务,数据库链接确实耗时,但一次吃得太多也会梗着。
锁太复杂,一般不显示加锁,最好使用离散解决方案,而不是独占资源,一般全部交给sql底层处理。
在程序代码中,一般不在sql代码中显式加锁如XLOCK,具体采用,不加锁,事务、加锁采用sp
MySQL数据库开发的三十六条军规 |
http://www.slideshare.net/mysqlops/mysql-9838563
http://www.iteye.com/topic/186542
sqlserver锁机制研究
九、sqlserver提供的表级锁
sqlserver所指定的表级锁定提示有如下几种
1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁。
2. NOLOCK:不添加共享锁和排它锁,当这个选项生效后,可能读到未提交读的数据或“脏数据”,这个选项仅仅应用于SELECT语句。
3. PAGLOCK:指定添加页锁(否则通常可能添加表锁)
4. READCOMMITTED用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL Server 2000 在此隔离级别上操作。
5. READPAST: 跳过已经加锁的数据行,这个选项将使事务读取数据时跳过那些已经被其他事务锁定的数据行,而不是阻塞直到其他事务释放锁,READPAST仅仅应用于READ COMMITTED隔离性级别下事务操作中的SELECT语句操作
6. READUNCOMMITTED:等同于NOLOCK。
7. REPEATABLEREAD:设置事务为可重复读隔离性级别。
8. ROWLOCK:使用行级锁,而不使用粒度更粗的页级锁和表级锁。
9. SERIALIZABLE:用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于 HOLDLOCK。
10. TABLOCK:指定使用表级锁,而不是使用行级或页面级的锁,SQL Server在该语句执行完后释放这个锁,而如果同时指定了HOLDLOCK,该锁一直保持到这个事务结束。
11. TABLOCKX:指定在表上使用排它锁,这个锁可以阻止其他事务读或更新这个表的数据,直到这个语句或整个事务结束。
12. UPDLOCK :指定在读表中数据时设置更新锁(update lock)而不是设置共享锁,该锁一直保持到这个语句或整个事务结束,使用UPDLOCK的作用是允许用户先读取数据(而且不阻塞其他用户读数据),并且保证在后来再更新数据时,这一段时间内这些数据没有被其他用户修改
SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除
SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除