SAP的锁机制

文章地址:http://blog.chinaunix.net/u2/66669/showart_1687418.html

一、SAP为什么要设置锁:

   1,保持数据的一致性

     如果几个用户要访问同样的资源,需要找到一种同步访问的方法去保持数据的一致性。比如说,在航班预订系统中,需要检查还有没有空座位,当检查的时候,你不想别人修改重要的数据(空座位的数量)。

   2,仅仅用Database锁是不够的

     数据库管理系统物理锁定了要修改的行记录,其他用户要等到数据库锁释放才能访问这个记录。

     在SAP系统中,当一个新屏幕显示的时候会释放掉Database锁,因为屏幕的改变会触发一个隐式的DB COMMIT。如果数据是从好几个屏幕收集来的话,而且在这段时间内这些数据会分别被锁定,仅仅用Database锁就不够了。

     SAP系统在应用服务器层面有一个全局的LOCK TABLE,可以用来设置逻辑锁来锁定相关的表条目,并有ENQUEUE工作进程来管理这些锁。SAP锁是一种逻辑意义上的锁,有可能你锁定的表条目在DATABASE上根本就不存在。

二、锁对象和其对应的FM

    在SE11里创建锁对象,自定义的锁对象都必须以EZ或者EY开头来命名。一个锁对象里只包含一个PRIMARY TABLE,可以包含若干个SECONDARY TABLE,锁的模式有三种:E,S,X。LOCK PARAMETERS里填写你要根据哪些字段来锁定表条目。

    模式E:当更改数据的时候设置为此模式。

    模式S:本身不需要更改数据,但是希望显示的数据不被别人更改。

    模式X:和E类似,但是不允许累加,完全独占。

    如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,其他用户不能再对这个锁对象加E、X、S模式的任意一种锁;

    如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,其他用户不能再对这个锁对象加E、X、S模式的任意一种锁;

    如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,其他用户不能再对这个锁对象加E、X模式的锁,但是可以加S模式的锁;

    如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,在这个程序,你还可以再对这个锁对象加E、S模式的锁,X模式的不可以。

    如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,在这个程序,你不可以再对这个锁对象加E、X、S模式的锁。

    如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,在这个程序,你还可以再对这个锁对象加S模式的锁,如果没有别的用户对其加S模式的锁,那么你还可以对其加E模式的锁。X模式的不可以。

    当激活锁对象的时候,系统会自动创建两个FM,ENQUEUE_<锁对象名>和DEQUEUE_<锁对象名>,分别用来锁定和解锁。

三、锁定和解锁

    当用逻辑锁来锁定表条目的时候,系统会自动向LOCK TABLE中写入记录。

    当调用设置锁的FM时,LOCK PARAMETERS如果没有指明,系统会锁定整个表。当然,LOCK PARAMETER:CLIENT有点特殊,如果不指定,默认是SY-MANDT;如果指定相应的CLIENT,会锁定对应CLIENT上的相应的表记 录;如果设置为SPACE,则锁定涉及所有的CLIENT。

    当逻辑锁设置失败后,一般会有两种例外。一个是EXCEPTION:FOREIGN_LOCK,意思是已经被锁定了;另一个是EXCEPTION:SYSTEM_FAILURE。

    有些情况下,程序中设置成功的逻辑锁会隐式的自己解锁。比如说程序结束发生的时候(MESSAGE TYPE为A或者X的时候),使用语句LEAVE PROGRAM,LEAVE TO TRANSACTION,或者在命令行输入/n回车以后。

    在程序的结束可以用DEQUEUE FUNCTION MODULE来解锁(当然如果你不写这个,程序结束的时候也会自动的解锁),这个时候,系统会自动从LOCK TABLE把相应的记录删除。使用DEQUEUE FUNCTION MODULE来解锁的时候,不会产生EXCEPTION。要解开你在程序中创建的所有的逻辑锁,可以用FM:DEQUEUE_ALL.

四、上锁的一般步骤

    先上锁,上锁成功之后,从数据库取数据,然后更改数据,接着更新到数据库,最后解锁。按照这个步骤,才能保证更改完全运行在锁的保护机制下。

### SAP 锁表的原因 在SAP系统中,锁机制用于防止多个事务同时修改同一对象而导致的数据不一致。当某个用户正在处理特定记录时,其他试图访问相同记录的操作会被暂时阻止直到第一个操作完成并释放锁定。如果长时间未能解除这些锁定,则可能导致性能下降甚至应用程序挂起等问题[^1]。 ### SAP 锁表的常见原因 - **长时间运行的程序**:某些后台作业或批处理过程可能因为错误而无限期占用资源。 - **网络连接中断**:客户端与服务器之间的通信失败可能会留下未关闭的会话及其关联的对象级锁定。 - **应用逻辑缺陷**:编程不当也可能造成不必要的长期持有锁定状态。 - **人为因素**:例如忘记保存更改就退出了交易屏幕等情况也会引发此类现象。 ### 查找和监控锁表的方法 为了有效管理和排查锁表问题,在日常运维工作中应定期检查系统的健康状况: #### 使用SM12事务码查看当前存在的所有类型的锁定列表 ```abap CALL TRANSACTION 'SM12' ``` 此功能允许管理员按不同维度筛选查询结果(比如按时间范围、用户名等),从而快速定位可疑条目。 #### 利用ST06事务码获取更详细的诊断信息 除了基本的状态报告外,还可以进一步深入探究具体实例背后的技术细节,包括但不限于涉及哪些数据库表格以及它们之间相互作用的方式等等。 ### 解决已发生的锁表问题 对于已经确认存在问题的情况,可以根据实际情况采取如下措施之一来解决问题: - **等待自然结束**:如果是由于正常的业务流程引起的短暂性锁定,通常不需要特别干预;只需耐心等候直至原作者完成其工作即可自动解锁。 - **强制终止进程**:针对那些确实影响到了正常使用的异常情形,可以通过`sm50`事务代码进入操作系统层面强行杀死对应的ABAP任务线程,但这一步骤务必谨慎行事以免引起更大规模的服务瘫痪事故。 - **调整参数设置**:适当放宽超时阈值或者优化SQL语句执行效率有助于减少非必要的争用冲突发生几率。 - **改进编码实践**:遵循最佳做法编写高效稳定的模块化代码结构,尽可能早地申请所需权限并在不再需要的时候立即放弃它,以此降低死锁的风险水平。 ### 预防未来可能出现的新问题 建立良好的开发习惯和技术文档管理体系至关重要,这不仅有利于提高团队协作效率还能大大缩短故障排除周期。另外就是加强员工培训力度,确保每个人都清楚知道如何正确使用各种工具和服务接口,共同维护好整个平台的安全稳定运行环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值