锁表机制{转载}
2009-10-21 23:23
148 查看
SAP的一大特点,就是可以设置Batch Job,定时定量跑程序。
但是这样就会碰到一个问题,会出现多个Batch job读写的情况。如果仅仅是读或是写的话,还好,最多是数据库延迟。但是如果对一个表,即读又写的话,就会产生数据一致性问题。比如,A Job读取数据X,然后做修改,但是修改的同时又有另外一个Job已经更新的X数据,结果A Job把另外一个更新的数据覆盖了,没有达到要预定的要求。
这时候就要引进锁表机制:
Exclusive lock: 排他锁,只有自己可以读、写
Shared lock:共享锁,自己可以读、写,他人只能读
Exclusive but not cumulative lock:排他但不累计,只有自己可以读、写,并且一个事务只能使用一次
两种实现方法:
1. SE11->新建Lock object(注意是E开头)->设置好表名和Lock Mode(就是我上面说的三种)->激活->Goto->Lock Modules(你可以在程序中调用自动生成的两个函数,进行锁表操作)
CALL FUNCTION 'ENQUEUE_EZKEVIN'
* EXPORTING
* MODE_ZKEVIN = 'E'
* ID =
* X_ID = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
* EXCEPTIONS
* FOREIGN_LOCK = 1
* SYSTEM_FAILURE = 2
* OTHERS = 3
CALL FUNCTION 'DEQUEUE_EZKEVIN'
* EXPORTING
* MODE_ZKEVIN = 'E'
* ID =
* X_ID = ' '
* _SCOPE = '3'
* _SYNCHRON = ' '
* _COLLECT = ' '
.
2. 还有一种就是动态的:
CALL FUNCTION 'ENQUEUE_E_TABLE'
* EXPORTING
* MODE_RSTABLE = 'E'
* TABNAME =
* VARKEY =
* X_TABNAME = ' '
* X_VARKEY = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
* EXCEPTIONS
* FOREIGN_LOCK = 1
* SYSTEM_FAILURE = 2
* OTHERS = 3
.
CALL FUNCTION 'DEQUEUE_E_TABLE'
* EXPORTING
* MODE_RSTABLE = 'E'
* TABNAME =
* VARKEY =
* X_TABNAME = ' '
* X_VARKEY = ' '
* _SCOPE = '3'
* _SYNCHRON = ' '
* _COLLECT = ' '
转自: http://blog.chinaunix.net/u1/59700/showart_1097281.html
但是这样就会碰到一个问题,会出现多个Batch job读写的情况。如果仅仅是读或是写的话,还好,最多是数据库延迟。但是如果对一个表,即读又写的话,就会产生数据一致性问题。比如,A Job读取数据X,然后做修改,但是修改的同时又有另外一个Job已经更新的X数据,结果A Job把另外一个更新的数据覆盖了,没有达到要预定的要求。
这时候就要引进锁表机制:
Exclusive lock: 排他锁,只有自己可以读、写
Shared lock:共享锁,自己可以读、写,他人只能读
Exclusive but not cumulative lock:排他但不累计,只有自己可以读、写,并且一个事务只能使用一次
两种实现方法:
1. SE11->新建Lock object(注意是E开头)->设置好表名和Lock Mode(就是我上面说的三种)->激活->Goto->Lock Modules(你可以在程序中调用自动生成的两个函数,进行锁表操作)
CALL FUNCTION 'ENQUEUE_EZKEVIN'
* EXPORTING
* MODE_ZKEVIN = 'E'
* ID =
* X_ID = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
* EXCEPTIONS
* FOREIGN_LOCK = 1
* SYSTEM_FAILURE = 2
* OTHERS = 3
CALL FUNCTION 'DEQUEUE_EZKEVIN'
* EXPORTING
* MODE_ZKEVIN = 'E'
* ID =
* X_ID = ' '
* _SCOPE = '3'
* _SYNCHRON = ' '
* _COLLECT = ' '
.
2. 还有一种就是动态的:
CALL FUNCTION 'ENQUEUE_E_TABLE'
* EXPORTING
* MODE_RSTABLE = 'E'
* TABNAME =
* VARKEY =
* X_TABNAME = ' '
* X_VARKEY = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
* EXCEPTIONS
* FOREIGN_LOCK = 1
* SYSTEM_FAILURE = 2
* OTHERS = 3
.
CALL FUNCTION 'DEQUEUE_E_TABLE'
* EXPORTING
* MODE_RSTABLE = 'E'
* TABNAME =
* VARKEY =
* X_TABNAME = ' '
* X_VARKEY = ' '
* _SCOPE = '3'
* _SYNCHRON = ' '
* _COLLECT = ' '
补充:前提条件是所有对这个表操作的程序都要有这个锁表机制,否则不起作用
转自: http://blog.chinaunix.net/u1/59700/showart_1097281.html
相关文章推荐
- Java异常处理机制【转载】
- 浅析Android中的消息机制(转载)
- 关于Java Servlet多线程机制(转载)
- 反射学习一 :学习反射机制 c# 转载
- JDK的动态(静态)代理机制(转载并整理修改)
- MFC消息响应机制分析 (转载)
- Java异常处理机制【转载】
- [转载]rabbitmq可靠发送的自动重试机制
- 深入 Eclipse 多线程机制(转载)
- java多线程之:Java中的ReentrantLock和synchronized两种锁定机制的对比 (转载)
- mysql锁机制(转载)
- [转载] 深度剖析消息反射机制
- oracle查看锁表进程,杀掉锁表进程[转载]
- Struts2数据传输的背后机制:ValueStack(值栈)(转载)
- Javascript继承机制的设计思想(转载于阮一峰的网络日志)
- Redis提供的持久化机制(RDB和AOF)【转载】
- QTP对象识别机制 (转载)
- 【转载整理】Hibernater的锁机制
- 《转载》PHP 底层的运行机制与原理
- [转载]C语言的异常机制