SAP锁相关

      关于SAP锁,以前一直没机会试, 主要还数据量太小,用户也不多,不需要考虑这样的事情. 今天抽空试了一下, 发现和想像还真有点不一样, 简述如下:

  1. 创建锁, SE11, 以EZ 或 EY 开头, 如果直接以E开头, 就要申请Object Key 了.
  2. 锁创建完毕, 激活后, 可以通过Goto -> Lock Modules 查看相应的加锁和解锁函数.
  3. 锁机制: SAP锁是一种逻辑锁,并不是数据库层面上的锁. 也就是说, 当加锁成功后,直接在后台或代码中还是可以修改数据的, 要想保证数据一致性,必须在操作数据前手工加锁,如果加锁不成功,表示己被别人锁定,不能操作.

下面再转两篇网文:

sap

http://blog.csdn.net/zjut_xiongfeng/archive/2008/10/29/3176487.aspx

 

1.sap锁的概念

sap为了同步同时多个用户操作同一数据,防止数据出现不一致性而采用了锁机制。一般 sap会在操作数据前设置锁,防止第二个用户进行修改操作,当操作结束后系统在释放锁。

 

2.SAP锁的类型

Exclusive lock

 

The locked data can be read or processed by one user only. A request for another exclusive lock or for a shared lock is rejected.

 

Shared lock

 

Several users can read the same data at the same time, but as soon as a user edits the data, a second user can no longer access this data. Requests for further shared locks are accepted, even if they are issued by different users, but exclusive locks are rejected.

 

Exclusive but not cumulative lock

 

Exclusive locks can be requested by the same transaction more than once and handled successively, but an exclusive but not cumulative lock can only be requested once by a given transaction. All other lock requests are rejected.

 

3.相关TCODE

SE11

 

4.相关表

DD25L:组合标题(方式,MC目标,锁定目标)(纪录了锁主表)

DD25T:

DD26S:视图的基本表和外来码关系(纪录了所有和锁相关的表)

DD27S:合计(视图,MC对象,锁定对象)字段

 

5.相关函数

RS_DD_ENQU_EDIT

RS_DD_ENQU_ADD

 

 

6.获取表相关锁的列表程序

REPORT  ZRFI0090 LINE-COUNT 70

                 LINE-SIZE  255

                 NO STANDARD PAGE HEADING.

type-pools: slis.

tables: DD02L,dd26s.

data: begin of g_tab occurs 10,

  TABNAME like dd26s-TABNAME,

  VIEWNAME type dd26s-VIEWNAME,

  ename like EMFIN-FBEMFIN,

  dname like EMFIN-FBEMFIN,

end of g_tab.

data g_fcat  type slis_t_fieldcat_alv.

data:  g_fieldcat type slis_fieldcat_alv.

select-options s_table for dd02l-TABNAME default 'VBAK'.

 

end-of-selection.

  select dd26s~TABNAME dd25l~VIEWNAME

  INTO CORRESPONDING FIELDS OF TABLE g_tab

  from dd26s

  inner join dd25l

    on dd26s~VIEWNAME = dd25l~VIEWNAME

       and dd25l~AGGTYPE = 'E'

    where TABNAME in s_table.

  loop at g_tab.

    concatenate 'ENQUEUE_' g_tab-VIEWNAME into g_tab-ename.

    concatenate 'DEQUEUE_' g_tab-VIEWNAME into g_tab-dname.

    modify g_tab.

  endloop.

 

  call function 'REUSE_ALV_FIELDCATALOG_MERGE'

    EXPORTING

      i_program_name     = 'ZTEST4'

      I_INTERNAL_TABNAME = 'G_TAB'

      i_inclname         = 'ZTEST4'

    CHANGING

      ct_fieldcat        = g_fcat.

 

  g_fieldcat-fieldname = 'ENAME'.

  g_fieldcat-seltext_s = '加锁函数名'.

  append g_fieldcat to g_fcat.

 

 g_fieldcat-fieldname = 'DNAME'.

  g_fieldcat-seltext_s = '解锁函数名'.

  append  g_fieldcat to g_fcat.

 

  call function 'REUSE_ALV_GRID_DISPLAY'

    exporting

*      i_callback_program       = repname

*      i_callback_user_command  = g_user_command

*      i_structure_name         = 'INV'

*      is_layout                = layout

       it_fieldcat              = g_fcat

*      is_variant               = g_variant

*      it_events                = events[]

*      i_callback_pf_status_set = 'F01_ALV_EVENT_PF_STATUS_SET'

    tables

      t_outtab                 = g_tab.

 

7.通过断点找程序所用到的锁

se38打开程序LSENAF01,并定位到send_enqueue子过程,在该过程中的任一语句设置断点。完成断点设置后,则去执行标准tcode,系统就会在程序调用锁时自动停止在断点处,这时你就可以通过调用堆栈获取加锁函数(ENQUEUE_XXXXXX),其中"XXXXXX"就是锁名称,你就可以通过SE11查看锁信息。

 

8.有多个表的锁的样例

:EMEKKOE

  主表:EKKO-->E 专用累积

  从表:EKPO-->E 专用累积

  参数:   

 

 

9 锁相关的函数

DEQUEUE_ALL  Release Locks of an LUW(释放当前LUW的所有锁)

 

SAP锁机制

http://www.lupaworld.com/home/space-28554-do-blog-id-139296.html

 

一、SAP为什么要设置锁:

   1,保持数据的一致性

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

   2,仅仅用Database锁是不够的

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

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

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

 

二、锁对象和其对应的FM

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

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

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

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

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

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

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

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

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

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

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

 

三、锁定和解锁

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

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

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

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

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

   

四、上锁的一般步骤

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值