ABAP数据库操作06-数据一致性
举例说明
案例1(单进程):银行用户A给用户B转账一百元,需要保证A账号里面减少一百元、B账号增加一百元,
a、成功时:A账号减少一百元,B账号增加一百元
b、失败时:AB两用户金额不变
案例2(多进程):当数据表tab不存在此学号的,往tab中插入该学生记录,当三个用户A、B、C同时操作时,发现tab不存在学生n的记录,各自插入一条记录,此时就会发生学生n在tab中会有3条相同的记录——防范:锁机制
从以上案例可以看出:数据一致性包含单进程、多进程 两种情况
1、逻辑工作单元(简称LUW)
可以按下图解理解什么叫LUW
一个逻辑工作单元(LUW)必须保证数据一致性
底层的DBLUW已包含数据一致性
1、简单的逻辑工作单元可参考下面的2.1DBLUW
2、对于比较复杂的LUW(如多屏幕的)2.1中的例子就不适用了,如:开始->屏幕1->屏幕2->结束,在调用屏幕2之前,系统会自动回滚,但到了屏幕2时,即使程序中断,屏幕1的操作也不会回滚——要达到一致性有2中方法:子过程(缺点:不能传参数)、函数SE37
SAP LUW需要我们自己控制
2、单进程数据一致性
commit work
rollback work
2.1 DBLUW
一个LUW运行过程中如果有中断,数据会自动回滚到最初状态
REPORT zcsdn_lion_db06.
DATA i_wa TYPE zlion_test.
SELECT SINGLE * FROM zlion_test INTO i_wa WHERE xh = 5.
*第一部分.
i_wa-name = '张三'.
MODIFY zlion_test FROM i_wa.
IF sy-subrc = 0.
ENDIF.
*第二部分.
i_wa-sex = '男'.
MODIFY zlion_test FROM i_wa.
IF sy-subrc = 0.
ENDIF.
执行前数据
1、设置2个断点后执行
2、查看数据—数据已变化
3、在第二个断点执行前关闭程序,再查看数据—数据回滚到程序执行前
以上的案例,在代码中添加commit work,只要有执行到commit work的,即使程序中断,在commit work之前的代码都已生效
REPORT zcsdn_lion_db06.
DATA i_wa TYPE zlion_test.
SELECT SINGLE * FROM zlion_test INTO i_wa WHERE xh = 5.
*第一部分.
i_wa-name = '张三'.
MODIFY zlion_test FROM i_wa.
IF sy-subrc = 0.
COMMIT WORK."在执行到commit work的,即使程序中断,在commit work之前的代码都生效,不会回滚
ENDIF.
*第二部分.
i_wa-sex = '男'.
MODIFY zlion_test FROM i_wa.
IF sy-subrc = 0.
ENDIF.
2.2 SAPLUW
方案:调用子程序、函数SE37
待定…
3、多进程数据一致性(锁对象)
锁机制,分三种锁状态
S:Shared lock(也称共享锁),多个用户可同时读取该表的数据,但当有用户修改时,其他用户拒绝访问(不能读取)
E:排他锁,
X:排他锁,
2.1 创建锁对象:SE11,命名以E开头,第二个字母Z或Y,然后跟表名(建议,不用表名也可以)
2.2 创建锁对象成功时,系统会自动创建两个函数:加锁函数、解锁函数,查看SE37,名字用:*锁对象名,在SE37搜索即可
锁对象分为:特定锁(只能锁指定的一个表),通用锁
注意:当对同一个表,先执行通用锁后,特定锁还能继续锁——所以对同一个表通用锁、特定锁不要混用
查看某个表是否有被锁住:SM12
SM12用处:出现某些锁会锁死,在SM12删除该锁