数据库事务与并发控制

2星 需积分: 3 1 下载量 179 浏览量 更新于2024-09-19 收藏 224KB PPTX 举报
"Transactions and Concurrency.pptx" 涉及的主题主要集中在数据库管理和并发控制,特别是事务处理和锁定机制。以下是对这些概念的详细解释: 事务(Transactions)是数据库操作的基本单元,它确保一组操作要么全部成功,要么全部回滚,以此保持数据的一致性和完整性。事务通常遵循四个基本属性,即ACID(原子性、一致性、隔离性和持久性): 1. **原子性(Atomicity)**:事务中的所有操作被视为单个不可分割的操作,即使在部分完成时出现故障,整个事务也会被回滚。 2. **一致性(Consistency)**:事务完成后,数据库状态必须符合预定义的完整性约束,保证数据的有效性。 3. **隔离性(Isolation)**:事务在执行时彼此隔离,避免一个事务看到其他事务的中间状态。这通常通过锁定机制实现。 4. **持久性(Durability)**:一旦事务提交,其结果将永久保存,即使系统发生故障。 事务的边界可以通过显式或隐式设置。显式事务是通过编程语言中的特定命令开始和结束,而隐式事务则是在执行某些数据库操作时自动开启和结束。 **锁(Locks)与阻塞(Blocking)**是数据库管理系统实现隔离性的关键工具。SQL Server使用不同类型的锁来管理数据访问,包括: - **排他锁(Exclusive Locks)**:不允许其他事务读取或写入受锁资源。 - **共享锁(Shared Locks)**:允许多个事务读取资源,但不允许写入。 - **更新锁(Update Locks)**:在读取并可能更新资源时使用,防止其他事务同时修改。 - **意向锁(Intent Locks)**:表示事务对更大范围资源的锁定意图,如意向共享锁和意向排他锁。 锁的兼容性决定了哪些事务可以并行执行,哪些会因资源冲突而被阻塞。例如,排他锁与任何其他类型的锁都不兼容,而共享锁只与共享锁和意向锁兼容。 **锁的升级(Lock Escalation)**是SQL Server 2008引入的一个优化策略,当数据库系统发现大量细粒度锁(如行级锁)存在时,为减少锁管理开销,会将这些锁升级到更粗粒度的锁(如表级锁)。但这可能导致更多的阻塞。 **锁定资源类型**包括行、页、对象(如表)、数据库,甚至更复杂的结构。SQL Server会根据需要在细粒度和粗粒度锁之间进行转换,以平衡并发性能和资源竞争。 **解决阻塞问题**是数据库管理员的重要任务。当一个事务持有某资源的锁,另一个事务请求不兼容的锁时,就会发生阻塞。此时,可以通过监控和分析锁等待,优化事务设计,或者调整隔离级别来缓解问题。 **并发控制(Concurrency Control)**方法除了锁定之外,还包括多版本并发控制(MVCC)和读已提交(Read Committed)、可重复读(Repeatable Read)、串行化(Serializable)等不同的隔离级别。不同的隔离级别在防止脏读、不可重复读和幻读方面有不同的效果,可以根据应用需求选择合适的级别。 总结来说,"Transactions and Concurrency" 主要关注如何在多用户环境中确保数据的正确性和一致性,以及如何有效地管理数据库的并发访问。理解事务和锁的概念,以及它们在SQL Server中的实现,对于数据库管理员和开发人员来说至关重要。

优化以下Oracle语句: SELECT SUBSTR(msn.serial_number, 1, 10) genset_sn, msi2.segment1 Genset_BOM_NUM, msi2.inventory_item_id, msi.segment1 key_component, mut1.serial_number component_sn, msi.description component_desc, wdj.date_completed, (SELECT MAX(aps.vendor_name) FROM ap_suppliers aps, bom_resources bor, mtl_unit_transactions mut, po_headers_all poh, po_lines_all pol, wip_osp_resources_val_v wor WHERE aps.vendor_id = poh.vendor_id AND bor.resource_id = wor.resource_id AND poh.po_header_id = pol.po_header_id AND pol.item_id = bor.purchase_item_id AND wor.wip_entity_id = mut.transaction_source_id AND mut.serial_number = mut1.serial_number AND mut.inventory_item_id = mut1.inventory_item_id AND mut.organization_id = mut1.organization_id AND mut.receipt_issue_type = 2 AND mut.transaction_source_type_id = 5 ) supplier FROM mtl_material_transactions mmt1, mtl_material_transactions mmt2, mtl_parameters mpa, mtl_serial_numbers msn, mtl_system_items msi, mtl_system_items msi2, mtl_transaction_types mtt1, mtl_transaction_types mtt2, mtl_unit_transactions mut1, mtl_unit_transactions mut2, wip_discrete_jobs_v wdj WHERE mmt1.inventory_item_id = mut1.inventory_item_id AND mmt1.organization_id = mut1.organization_id AND WDJ.PRIMARY_ITEM_ID = msi2.INVENTORY_ITEM_ID AND mmt1.transaction_id = mut1.transaction_id AND mmt1.transaction_source_id = wdj.wip_entity_id AND mmt1.transaction_type_id = mtt1.transaction_type_id AND mtt1.transaction_type_name = 'WIP Issue' AND NOT EXISTS (SELECT 'WIP Negative Issue or WIP Return' FROM mtl_material_transactions mmt3, mtl_transaction_types mtt3, mtl_unit_transactions mut3 WHERE mmt3.transaction_id = mut3.transaction_id AND mmt3.transaction_type_id = mtt3.transaction_type_id AND mmt3.transaction_date > mmt1.transaction_date AND mtt3.transaction_type_name IN ('WIP Negative Issue', 'WIP Return') AND mut3.serial_number = mut1.serial_number AND mut3.inventory_item_id = mut1.inventory_item_id) AND mmt2.transaction_id = mut2.transaction_id AND mmt2.transaction_source_id = wdj.wip_entity_id AND mmt2.transaction_type_id = mtt2.transaction_type_id AND mtt2.transaction_type_name = 'WIP Completion' AND mpa.organization_code = 'WHP' AND msn.current_organization_id = mpa.organization_id AND LENGTH(msn.serial_number) >= 10 AND msi.inventory_item_id = mmt1.inventory_item_id AND msi.organization_id = mmt1.organization_id AND (msi.planning_make_buy_code = 2 OR msi.segment1 LIKE 'SO%') AND mut2.serial_number = msn.serial_number AND mut2.inventory_item_id = msn.inventory_item_id AND mut2.organization_id = mpa.organization_id AND msi2.ORGANIZATION_ID = '323'

2023-07-15 上传

优化sql:SELECT we.organization_id ,we.wip_entity_id ,case when wl.line_id is null then we.wip_entity_name else '' end wip_entity_name ,we.primary_item_id ,mtt.transaction_type_name ,mmt.transaction_date ,bd.department_code ,mmt.inventory_item_id ,mmt.subinventory_code ,mta.reference_account ,br.resource_code ,lu2.meaning as line_type_name ,mta.base_transaction_value ,mta.cost_element_id ,flv.meaning as cost_element ,wdj.class_code job_type_code ,ml.meaning job_type_name FROM (select * from gerp.mtl_material_transactions where substr(transaction_date,1,7) >= '2023-06' and transaction_source_type_id = 5) mmt inner join gerp.wip_entities we on mmt.organization_id = we.organization_id inner join gerp.mtl_transaction_accounts mta on mta.transaction_source_id = we.wip_entity_id and mta.transaction_id = mmt.transaction_id and mta.transaction_source_type_id = 5 inner join gerp.mtl_transaction_types mtt on mtt.transaction_type_id = mmt.transaction_type_id inner join mfg_lookups lu2 on lu2.lookup_code = mta.accounting_line_type and lu2.lookup_type = 'CST_ACCOUNTING_LINE_TYPE' inner join gerp.mtl_system_items_b msi on msi.inventory_item_id = mmt.inventory_item_id and msi.organization_id = mta.organization_id left join gerp.bom_departments bd on bd.department_id = mmt.department_id left join gerp.bom_resources br on br.resource_id = mta.resource_id left join gerp.wip_lines wl on wl.line_id = mmt.repetitive_line_id left join gerp.wip_discrete_jobs wdj on wdj.wip_entity_id = mta.transaction_source_id left join gerp.fnd_lookup_values_vl flv on cast(mta.cost_element_id as string) = flv.lookup_code and flv.lookup_type = 'CST_COST_CODE_TYPE' left join mfg_lookups ml on ml.lookup_code = wdj.job_type and ml.lookup_type = 'WIP_DISCRETE_JOB' 。其中mmt,we,mta,msi,wdj数据量很大

2023-06-10 上传