• 数据库中的锁


    如何避免死锁

    1 使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务;

    2 设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂;

    3 优化程序,检查并避免死锁现象出现;

    4 .对所有的脚本和SP都要仔细测试,在正是版本之前。

    5 所有的SP都要有错误处理(通过@error)

    6 一般不要修改SQL SERVER事务的默认级别。不推荐强行加锁

     

    1 如何锁一个表的某一行

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    SELECT * FROM table ROWLOCK WHERE id = 1

    2 锁定数据库的一个表

    SELECT * FROM table WITH (HOLDLOCK)

    加锁语句:

    sybase:

    update 表 set col1=col1 where 1=0 ;

    MSSQL:

    select col1 from 表 (tablockx) where 1=0 ;

    oracle:

    LOCK TABLE 表 IN EXCLUSIVE MODE ;

    加锁后其它人不可操作,直到加锁用户解锁,用commit或rollback解锁

     

    3)死锁 案例

    在第一个连接中执行以下语句

    begin tran

    update table1

    set A='aa'  where B='b2'

    waitfor delay '00:00:30'

    update table2

    set D='d5'  where E='e1'

    commit tran

    在第二个连接中执行以下语句

    begin tran

    update table2

    set D='d5'  where E='e1'

    waitfor delay '00:00:10'

    update table1

    set A='aa'   where B='b2'

    commit tran

    同时执行,系统会检测出死锁,并中止进程

     

    1 如何锁一个表的某一行

    A 连接中执行

    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

    begin tran

    select * from table1 with (rowlock) where id=3

    waitfor delay '00:00:05'

    commit tran

    B连接中如果执行

    update table1 set colname='10' where id=3 --则要等待5秒

    ------------------------------------------------------------------------------------------------

    注意一下区别  HOLDLOCKTABLOCKX 级别更高,锁定期间什么都不能操作

    SELECT * FROM table WITH (HOLDLOCK) 
    其他事务可以读取表,但不能更新删除

    SELECT * FROM table WITH (TABLOCKX) 
    其他事务不能读取表, 不能更新和删除

     总结:

    1、使用SQL语句: 加上LOCK或 RowLock;
    2、记得UPDATE后要COMMIT或ROLLBACK;
    3、运用存储过程记得加上CLOSE;

  • 相关阅读:
    Elasticsearch 快速入门
    Linux 非互联网环境安装依赖包
    linux 安装mysql(rpm文件安装)
    Nginx安装与配置文件nginx.conf详解
    Linux 知识
    MySQL Windows安装连接
    post请求body格式
    MySQL 数据库备份
    SOAP与restful webservice
    大数据架构工具hadoop
  • 原文地址:https://www.cnblogs.com/brain008/p/14506164.html
Copyright © 2020-2023  润新知