二维码

[lock] 数据库表行记录层级锁定

Twilight发表于 2014-10-08 19:44Twilight 最后回复于 2014-10-08 19:44 [复制链接] 5419 0

通常某人通过表格维护生成器维护一个表时,其他人则不能同时在维护这张表,因为sap默认的是表层级的锁定。这里教大家一种方法实现表行记录层级的锁定,可以实现多人同时维护这张表,但不能同时修改同一条记录。

1、se11创建表YTEST_SHUKS3
Row level lock 1.png
2、为表创建表格维护生成器(菜单:实用程序->表格维护生成器)
Row level lock 2.png
PS:这里的屏幕编号是点击系统自动建议的应为2,不是1,截图错了,你的可能与这里的不一致
点击创建,表格维护代码自动生成,保存在function group(YFMG_LEON,可以se80创建并激活)中
3、创建锁对象EYTEST_SHUKS3
Row level lock 3.png
锁一定要有E开头,如果是我们自定义的锁,通常用EZ或EY开头
Row level lock 4.png
name:需要加锁的表名
lock mode:
1)S (Shared lock, read lock) 共享锁——只读锁,一个用户正在读数据时,阻止其他用户更改该数据;该模式允许 多个用户访问指定表行,但只能读访问.任何时候都不允许写访问
2)E (Exclusive lock, write lock) 排他锁(独占锁)——可写锁,一个用户正在修改数据时,阻止其他用户更改该数据;只有自己可以读、写
3)X (eXclusive lock, extended write lock, cannot be cumulated) 排他但不累计,只有自己可以读、写,并且一个事务只能使用一次
如果我们使用一般情况下,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模式的不可以。
Row level lock 5.png
保存并激活lock,系统会自动创建两个FM,ENQUEUE_<锁对象名>和DEQUEUE_<锁对象名>,分别用来锁定和解锁
ENQUEUE_EYTEST_SHUKS3 加锁
DEQUEUE_EYTEST_SHUKS3 解锁
4、新建程序YDAMON_077和t-code:YTEST_SHUKS3(program and selection screen)
程序代码:
  1. **Selection range for view maintenance
  2. DATA:BEGIN OF selekttab OCCURS 1.         "Selektionsbereich
  3.         INCLUDE STRUCTURE vimsellist.
  4. DATA: END OF selekttab,

  5. **Table of inactive CUA functions for view maintenance
  6. BEGIN OF excl_cua_funct OCCURS 1.    "inaktive CUA-Fkt bei View-Pflege
  7.         INCLUDE STRUCTURE vimexclfun.
  8. DATA: END OF excl_cua_funct.

  9. DATA:lt_enq_del TYPE STANDARD TABLE OF seqg3,
  10.      lt_enq_read TYPE STANDARD TABLE OF seqg7,
  11.      lw_enq_read TYPE seqg7,
  12.      lw_enq_del TYPE seqg3,
  13.      lv_subrc TYPE sy-subrc.

  14. *Read all the lock details in system  
  15. CALL FUNCTION 'ENQUE_READ2'
  16.   EXPORTING
  17.     gclient = sy-mandt
  18.     gname   = ' '
  19.     guname  = '*'
  20.   TABLES
  21.     enq     = lt_enq_read.

  22. *We will search entry for table level lock for our table
  23. LOOP AT lt_enq_read INTO lw_enq_read
  24.   WHERE gname EQ 'RSTABLE'
  25.   AND   garg CS 'YTEST_SHUKS3'.
  26.   MOVE-CORRESPONDING lw_enq_read TO lw_enq_del.
  27.   APPEND lw_enq_del TO lt_enq_del.
  28. ENDLOOP.

  29. *Delete table level lock entry for our table 可以用sm12查看被锁的记录,这里是删除锁对象
  30. CALL FUNCTION 'ENQUE_DELETE'
  31.   EXPORTING
  32.     check_upd_requests = 1
  33.   IMPORTING
  34.     subrc              = lv_subrc
  35.   TABLES
  36.     enq                = lt_enq_del.

  37. *Now call the table maintenace generator.
  38. CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
  39.   EXPORTING
  40.     action               = 'U'
  41.     view_name            = 'YTEST_SHUKS3'
  42.     show_selection_popup = 'X'
  43.   TABLES
  44.     dba_sellist          = selekttab
  45.     excl_cua_funct       = excl_cua_funct.
复制代码

5、se80 打开function group(YFMG_LEON),对002屏幕增强,即在PBO里添加MODULE m_change_locking.
Row level lock 6.png
双击module名称,添加到一个include里,这个include可以自己新建,代码:
  1. *Call the function module corresponding to the lock object we created
  2.   CALL FUNCTION 'ENQUEUE_EYTEST_SHUKS3'
  3.     EXPORTING
  4.       matnr          = ytest_shuks3-matnr
  5.       werks          = ytest_shuks3-werks
  6.     EXCEPTIONS
  7.       foreign_lock   = 1
  8.       system_failure = 2
  9.       OTHERS         = 3.
  10.   IF sy-subrc NE 0.
  11. * row is locked..hence gray.. 因为上面把锁对象删除了 这里加锁不成功,会修改屏幕成不可输状态
  12.     LOOP AT SCREEN.
  13.       screen-input = 0.
  14.       MODIFY SCREEN.
  15.     ENDLOOP.
  16.   ENDIF.
复制代码
6、输入自定义t-code,添加几条记录
Row level lock 7.png
7、测试结果
打开1个session,输入t-code:YTEST_SHUKS3
Row level lock 8.png

Row level lock 9.png

打开另1个session,输入t-code:YTEST_SHUKS3,条件全选,默认所有记录
Row level lock 10.png

PS:sm12解锁

回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表