SAP锁机制
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,在这个程序,你还可以再对这个锁对象加S模式的锁,如果没有别的用户对其加S模式的锁,那么你还可以对其加E模式的锁。X模式的不可以。
当激活锁对象的时候,系统会自动创建两个FM,ENQUEUE_<锁对象名>和DEQUEUE_<锁对象名>,分别用来锁定和解锁。
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,
如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,其他用户不能再对这个锁对象加E、X模式的锁,但是可以加S模式的锁;
如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,在这个程序,你还可以再对这个锁对象加E、S模式的锁,X模式的不可以。
如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,在这个程序,你不可以再对这个锁对象加E、X、S模式的锁。
(转载)SAP锁机制
写了这么久的ABAP了,还没有用过sap的锁,今天看看sap锁机制,有空试一试
文章地址:/u2/66669/showart_1687418.html
一、SAP为什么要设置锁:
1,保持数据的一致性
如果几个用户要访问同样的资源,需要找到一种同步访问的方法去保持数据的一致性。比如说,在航班预订系统中,需要检查还有没有空座位,当检查的时候,你不想别人修改重要的数据(空座位的数量)。
3.相关TCODE
SE11
4.相关表
DD25L:组合标题(方式,MC目标,锁定目标)(纪录了锁主表)
DD25T:
DD26S:视图的基本表和外来码关系(纪录了所有和锁相关的表)
DD27S:合计(视图,MC对象,锁定对象)字段
5.相关函数
RS_DD_ENQU_EDIT
RS_DD_ENQU_ADD
6.获取表相关锁的列表程序
8.有多个表的锁的样例
锁:EMEKKOE
主表:EKKO-->E专用累积
从表:EKPO-->E专用累积
参数:
9锁相关的函数
DEQUEUE_ALL Release Locks of an LUW(释放当前LUW的所有锁)
10如何对表加锁
CALL FUNCTION'ENQUEUE_E_TABLE'
EXPORTING
三、锁定和解锁
当用逻辑锁来锁定表条目的时候,系统会自动向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回车以后。
concatenate 'DEQUEUE_' g_tab-VIEWNAME into g_tab-dname.
modify g_tab.
endloop.
call function 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = 'ZTEST4'
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
四、上锁的一般步骤
先上锁,上锁成功之后,从数据库取数据,然后更改数据,接着更新到数据库,最后解锁。按照这个步骤,才能保证更改完全运行在锁的保护机制下。
以下再转一个重量级人物jack Wu的链接
abap--如何获取sap标准表的相关的锁(lock)
最近经常有abap问关于锁的问题,我特此收集了一些资料,供大家参考,也请大家指正。
2,仅仅用Database锁是不够的
数据库管理系统物理锁定了要修改的行记录,其他用户要等到数据库锁释放才能访问这个记录。
在SAP系统中,当一个新屏幕显示的时候会释放掉Database锁,因为屏幕的改变会触发一个隐式的DB COMMIT。如果数据是从好几个屏幕收集来的话,而且在这段时间内这些数据会分别被锁定,仅仅用Database锁就不够了。
在程序的结束可以用DEQUEUE FUNCTION MODULE来解锁(当然如果你不写这个,程序结束的时候也会自动的解锁),这个时候,系统会自动从LOCK TABLE把相应的记录删除。使用DEQUEUE FUNCTION MODULE来解锁的时候,不会产生EXCEPTION。要解开你在程序中创建的所有的逻辑锁,可以用FM:DEQUEUE_ALL.
答案:首先要在ABAP字典中创建锁对象,然后才能在ABAP程序中设锁。创建锁对象时,系统会自动生成两个FM来进行锁管理。
用于设锁的FM为:ENQUEUE_<锁对象名>。它用于在锁表(Lock Table)中生成一个锁项(Lock Entry)。若设锁不成功的话,就会在Return中反映出来。
* i_callback_pf_status_set = 'F01_ALV_EVENT_PF_STATபைடு நூலகம்S_SET'
tables
t_outtab = g_tab.
7.通过断点找程序所用到的锁
用se38打开程序LSENAF01,并定位到send_enqueue子过程,在该过程中的任一语句设置断点。完成断点设置后,则去执行标准tcode,系统就会在程序调用锁时自动停止在断点处,这时你就可以通过调用堆栈获取加锁函数(ENQUEUE_XXXXXX),其中"XXXXXX"就是锁名称,你就可以通过SE11查看锁信息。
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.
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.
模式E:当更改数据的时候设置为此模式。
模式S:本身不需要更改数据,但是希望显示的数据不被别人更改。
模式X:和E类似,但是不允许累加,完全独占。
如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,其他用户不能再对这个锁对象加E、X、S模式的任意一种锁;
如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,其他用户不能再对这个锁对象加E、X、S模式的任意一种锁;
* 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[]
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.
MODE_RSTABLE ='E'
TABNAME ='Table Name'
* VARKEY =
* X_TABNAME = ' '
* X_VARKEY = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
EXCEPTIONS
FOREIGN_LOCK = 1
SYSTEM_FAILURE = 2
OTHERS = 3
.
IF sy-subrc = 0.
WRITE: 'Lock table successfully!'.
else.
write: 'Failed'.
ENDIF.
p锁对象(Lock Object)和FM(Function Module)
激活锁定对象时,产生的FM的名字是什么?
SAP系统在应用服务器层面有一个全局的LOCK TABLE,可以用来设置逻辑锁来锁定相关的表条目,并有ENQUEUE工作进程来管理这些锁。SAP锁是一种逻辑意义上的锁,有可能你锁定的表条目在DATABASE上根本就不存在。
二、锁对象和其对应的FM
在SE11里创建锁对象,自定义的锁对象都必须以EZ或者EY开头来命名。一个锁对象里只包含一个PRIMARY TABLE,可以包含若干个SECONDARY TABLE,锁的模式有三种:E,S,X。LOCK PARAMETERS里填写你要根据哪些字段来锁定表条目。
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.
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
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.
当激活锁对象的时候,系统会自动创建两个FM,ENQUEUE_<锁对象名>和DEQUEUE_<锁对象名>,分别用来锁定和解锁。
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,
如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,其他用户不能再对这个锁对象加E、X模式的锁,但是可以加S模式的锁;
如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,在这个程序,你还可以再对这个锁对象加E、S模式的锁,X模式的不可以。
如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,在这个程序,你不可以再对这个锁对象加E、X、S模式的锁。
(转载)SAP锁机制
写了这么久的ABAP了,还没有用过sap的锁,今天看看sap锁机制,有空试一试
文章地址:/u2/66669/showart_1687418.html
一、SAP为什么要设置锁:
1,保持数据的一致性
如果几个用户要访问同样的资源,需要找到一种同步访问的方法去保持数据的一致性。比如说,在航班预订系统中,需要检查还有没有空座位,当检查的时候,你不想别人修改重要的数据(空座位的数量)。
3.相关TCODE
SE11
4.相关表
DD25L:组合标题(方式,MC目标,锁定目标)(纪录了锁主表)
DD25T:
DD26S:视图的基本表和外来码关系(纪录了所有和锁相关的表)
DD27S:合计(视图,MC对象,锁定对象)字段
5.相关函数
RS_DD_ENQU_EDIT
RS_DD_ENQU_ADD
6.获取表相关锁的列表程序
8.有多个表的锁的样例
锁:EMEKKOE
主表:EKKO-->E专用累积
从表:EKPO-->E专用累积
参数:
9锁相关的函数
DEQUEUE_ALL Release Locks of an LUW(释放当前LUW的所有锁)
10如何对表加锁
CALL FUNCTION'ENQUEUE_E_TABLE'
EXPORTING
三、锁定和解锁
当用逻辑锁来锁定表条目的时候,系统会自动向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回车以后。
concatenate 'DEQUEUE_' g_tab-VIEWNAME into g_tab-dname.
modify g_tab.
endloop.
call function 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = 'ZTEST4'
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
四、上锁的一般步骤
先上锁,上锁成功之后,从数据库取数据,然后更改数据,接着更新到数据库,最后解锁。按照这个步骤,才能保证更改完全运行在锁的保护机制下。
以下再转一个重量级人物jack Wu的链接
abap--如何获取sap标准表的相关的锁(lock)
最近经常有abap问关于锁的问题,我特此收集了一些资料,供大家参考,也请大家指正。
2,仅仅用Database锁是不够的
数据库管理系统物理锁定了要修改的行记录,其他用户要等到数据库锁释放才能访问这个记录。
在SAP系统中,当一个新屏幕显示的时候会释放掉Database锁,因为屏幕的改变会触发一个隐式的DB COMMIT。如果数据是从好几个屏幕收集来的话,而且在这段时间内这些数据会分别被锁定,仅仅用Database锁就不够了。
在程序的结束可以用DEQUEUE FUNCTION MODULE来解锁(当然如果你不写这个,程序结束的时候也会自动的解锁),这个时候,系统会自动从LOCK TABLE把相应的记录删除。使用DEQUEUE FUNCTION MODULE来解锁的时候,不会产生EXCEPTION。要解开你在程序中创建的所有的逻辑锁,可以用FM:DEQUEUE_ALL.
答案:首先要在ABAP字典中创建锁对象,然后才能在ABAP程序中设锁。创建锁对象时,系统会自动生成两个FM来进行锁管理。
用于设锁的FM为:ENQUEUE_<锁对象名>。它用于在锁表(Lock Table)中生成一个锁项(Lock Entry)。若设锁不成功的话,就会在Return中反映出来。
* i_callback_pf_status_set = 'F01_ALV_EVENT_PF_STATபைடு நூலகம்S_SET'
tables
t_outtab = g_tab.
7.通过断点找程序所用到的锁
用se38打开程序LSENAF01,并定位到send_enqueue子过程,在该过程中的任一语句设置断点。完成断点设置后,则去执行标准tcode,系统就会在程序调用锁时自动停止在断点处,这时你就可以通过调用堆栈获取加锁函数(ENQUEUE_XXXXXX),其中"XXXXXX"就是锁名称,你就可以通过SE11查看锁信息。
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.
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.
模式E:当更改数据的时候设置为此模式。
模式S:本身不需要更改数据,但是希望显示的数据不被别人更改。
模式X:和E类似,但是不允许累加,完全独占。
如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,其他用户不能再对这个锁对象加E、X、S模式的任意一种锁;
如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,其他用户不能再对这个锁对象加E、X、S模式的任意一种锁;
* 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[]
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.
MODE_RSTABLE ='E'
TABNAME ='Table Name'
* VARKEY =
* X_TABNAME = ' '
* X_VARKEY = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
EXCEPTIONS
FOREIGN_LOCK = 1
SYSTEM_FAILURE = 2
OTHERS = 3
.
IF sy-subrc = 0.
WRITE: 'Lock table successfully!'.
else.
write: 'Failed'.
ENDIF.
p锁对象(Lock Object)和FM(Function Module)
激活锁定对象时,产生的FM的名字是什么?
SAP系统在应用服务器层面有一个全局的LOCK TABLE,可以用来设置逻辑锁来锁定相关的表条目,并有ENQUEUE工作进程来管理这些锁。SAP锁是一种逻辑意义上的锁,有可能你锁定的表条目在DATABASE上根本就不存在。
二、锁对象和其对应的FM
在SE11里创建锁对象,自定义的锁对象都必须以EZ或者EY开头来命名。一个锁对象里只包含一个PRIMARY TABLE,可以包含若干个SECONDARY TABLE,锁的模式有三种:E,S,X。LOCK PARAMETERS里填写你要根据哪些字段来锁定表条目。
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.
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
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.