sap在对物料相关内容进行修改时会对这条记录进行锁定,不允许其他用户同时修改,以防止数据不一致。 在排他性E方式锁定的情况下,甚至不允许其他用户(或同一用户的其他进程的读取)。
你用mm01创建物料时,虽然看到屏幕提示已经创建完毕,但其实系统是采用异步更新的方式, 这个时候物料记录并没有真正更新到数据库中去,相关的数据都停留在table vbhdr和vbdata两个表里面,用sm13可以看到等待更新的记录。 只有在完成更新后sm13里面的记录在会消失。这个过程可能需要一段时间。在繁忙的身材系统中甚至有第二天才创建完毕的情况。
你的物料在你用mm02想更改时,还没有更新到数据库处于锁定状态所以会提示你物料被block,在sm12中删除锁定后, sm13中的数据就没有办法更新了(更新前必须要先锁定),系统实际上就放弃了你mm01中的创建动作对数据库记录的修改。所以你就看到这个物料不存在了。
想避免这种情况,最简单的办法就是稍微等一会儿再做mm02,一般一两分钟就可以了。
where SalesOrderID='43662'SELECT resource_type, request_mode, resource_description,request_session_id, DB_NAME(resource_database_id)as resource_databaseFROM sysdm_tran_locksWHERE resource_type <>'DATABASE'--ROLLBACK TRAN 在事务回滚之前, 查看锁的类型: 其他session对Table只读, 不能更新, 在开一个新的session测试:select from SalesSalesOrderHeader where SalesOrderID='43662'goupdate SalesSalesOrderHeader set OrderDate=GETDATE() where SalesOrderID='43662' select可以正常执行, update语句一直处于等待状态, 等待上面的session释放锁 2 Update locks (U): 更新锁是共享锁和独占锁的组合用UPDLOCK保持更新锁USE AdventureWorks2008BEGIN TRANselect from SalesSalesOrderHeader WITH(UPDLOCK)where SalesOrderID='43662'SELECT resource_type, request_mode, resource_description,request_session_id,DB_NAME(resource_database_id)as resource_databaseFROM sysdm_tran_locksWHERE resource_type <>'DATABASE'ROLLBACK TRAN 查看到锁的信息: 3Exclusive locks (X): 独占锁是为了锁定数据被一个session修改的数据, 而不能够被另外的session修改 只能指定NOLOCK来读取USE AdventureWorks2008BEGIN TRANupdate SalesSalesOrderHeader set ShipDate=GETDATE() where SalesOrderID='43662'WHERE resource_type <>'DATABASE'ROLLBACK TRAN 查看锁: 4Intent locks (I): 意向锁用于建立锁的层次结构 意向锁包含三种类型:意向共享 (IS)、意向排他 (IX) 和意向排他共享 (SIX)。 数据库引擎使用意向锁来保护共享锁(S 锁)或排他锁(X 锁)放置在锁层次结构的底层资源上。 意向锁之所以命名为意向锁,是因为在较低级别锁前可获取它们,因此会通知意向将锁放置在较低级别上。 意向锁有两种用途: 防止其他事务以会使较低级别的锁无效的方式修改较高级别资源。 提高数据库引擎在较高的粒度级别检测锁冲突的效率。
以上就是关于SAP 为什么用S**M12把记录删除后物料也不见了全部的内容,包括:SAP 为什么用S**M12把记录删除后物料也不见了、SQL Server表锁定原理以及如何解除锁定、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)