ホームページ データベース mysql チュートリアル 关于自治事务和锁PRAGMAAUTONOMOUS_TRANSACTION&LOCK

关于自治事务和锁PRAGMAAUTONOMOUS_TRANSACTION&LOCK

Jun 07, 2016 pm 04:10 PM
事務 について

之前遇到的一个问题, 可以稳定重现. Oracle 的 INV 提供了一个接口 inv_lot_api_pub.auto_gen_lot() , 用来自动为 item 产生 lot number, 调用一次这个接口, lot number 就会自动 + 1; 看里头的代码, 是先从 MTL_SYSTEM_ITEMS 这个表里面取出一个字段 start_

之前遇到的一个问题, 可以稳定重现.

Oracle 的 INV 提供了一个接口 inv_lot_api_pub.auto_gen_lot() , 用来自动为 item 产生 lot number, 调用一次这个接口, lot number 就会自动 + 1; 看里头的代码, 是先从 MTL_SYSTEM_ITEMS 这个表里面取出一个字段 start_auto_lot_number, 比方说取出来的数值是1000, 那么就会把 1000 当做当前的 lot number, 接着会调用一个 procedure, 去更新这个字段, 变成 1001. 这个procedure 名字叫做 update_msi(). 最后去验证 1000 这个 lot number 是不是已经存在了. 如果存在, 那么会重新取出 1001 当做当前 lot number, 并且验证是不是存在, 直到找到没有重复的lot number, 就把它返回给调用 api 的地方.

那么这段代码会有什么问题呢? 我们假设一个场景, 有两个 session 同时调用这个 api, 那么在从 MSI 取数据的阶段, 有可能两个 session 会取出来相同的lot number. 嗯, 这个是有可能的. 如果这两个 session 是在为同一个 item 产生 lot number 就还好, 但是如果是不同的item, 就会为不同的两个 item 产生相同的 lot number. 这样数据就错了.

解决的办法就是通过锁来锁住被选择的 lot number, 并且在更新成功之后释放锁.

锁住选择的数据的方法是使用 for update 语句

 

     SELECT auto_lot_alpha_prefix,
            start_auto_lot_number
       INTO l_lot_prefix,
            l_lot_suffix
       FROM mtl_system_items
      WHERE organization_id = p_org_id
        AND inventory_item_id = p_inventory_item_id for update
ログイン後にコピー

一旦有数据被选中, 那么同样使用这个 SQL 的session 将不能获得这些数据, 这就保证了无法产生相同的lot number. 当成功更新 lot number 之后, 就可以用 commit 释放锁了.

 

那么问题来了, 如果我们使用 commit 提交这个事务, 将会把所有的事务处理都提交, 那么如果之后出现错误回滚了, 将会有一部分数据提交, 另一部分数据回滚了. 解决的办法是使用自治事务. 从 select for update 语句开始, 到update MSI 并 commit 为止, 我们定义一个 procedure 并声明这是一个 PRAGMA AUTONOMOUS_TRANSACTION. 这样提交事务的时候就只会提交这个自治事务所做的更改, 并且释放锁给其他语句使用. 在自治事务之外的数据更新操作都不会受到影响.

这样通过锁和声明自治事务, 就可以保证不会在两个 session 里面获取到相同的 lot number 了;

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ロック待機タイムアウトを超過しました。トランザクションを再起動してください - MySQL エラーの解決方法: トランザクション待機タイムアウト ロック待機タイムアウトを超過しました。トランザクションを再起動してください - MySQL エラーの解決方法: トランザクション待機タイムアウト Oct 05, 2023 am 08:46 AM

Lockwaittimeoutexceeded;tryrestartingtransaction - MySQL エラーの解決方法: トランザクション待機タイムアウト。MySQL データベースを使用すると、一般的なエラーが発生することがあります: Lockwaittimeoutexceeded;tryrestartingtransaction。このエラーは、トランザクション待機タイムアウトを示します。このエラーは通常、次の場合に発生します。

MySQL トランザクション処理: 自動送信と手動送信の違い MySQL トランザクション処理: 自動送信と手動送信の違い Mar 16, 2024 am 11:33 AM

MySQL トランザクション処理: 自動送信と手動送信の違い。MySQL データベースでは、トランザクションは一連の SQL ステートメントです。すべての実行が成功するか、すべての実行が失敗するかのいずれかで、データの一貫性と整合性が保証されます。 MySQL では、トランザクションは自動送信と手動送信に分けられ、その違いはトランザクション送信のタイミングとトランザクションの制御範囲にあります。以下では、自動送信と手動送信の違いを詳しく紹介し、具体的なコード例を示して説明します。 1. MySQL が表示されない場合は自動的に送信する

PHP PDO チュートリアル: 基本から習得までの上級ガイド PHP PDO チュートリアル: 基本から習得までの上級ガイド Feb 19, 2024 pm 06:30 PM

1. PDO の概要 PDO は、データベースを操作するためのオブジェクト指向の方法を提供する PHP の拡張ライブラリです。 PDO は、Mysql、postgresql、oracle、SQLServer などのさまざまなデータベースをサポートします。 PDO を使用すると、開発者は統合 API を使用してさまざまなデータベースを操作できるため、さまざまなデータベースを簡単に切り替えることができます。 2. PDO はデータベースに接続します PDO を使用してデータベースに接続するには、まず PDO オブジェクトを作成する必要があります。 PDO オブジェクトのコンストラクターは、データベース タイプ、ホスト名、データベース ユーザー名、およびパスワードの 3 つのパラメーターを受け取ります。たとえば、次のコードは、mysql データベースに接続するオブジェクトを作成します。 $dsn="mysq

MySQL トランザクションの原則と適用シナリオ MySQL トランザクションの原則と適用シナリオ Mar 02, 2024 am 09:51 AM

MySQL トランザクションの原理と適用シナリオ データベース システムでは、トランザクションは一連の SQL 操作であり、これらの操作はすべて正常に実行されるか、すべて失敗してロールバックされます。一般的に使用されるリレーショナル データベース管理システムとして、MySQL はトランザクション特性をサポートし、データベース内のデータの一貫性、分離性、耐久性、アトミック性を保証できます。この記事では、MySQL トランザクションの基本原則から始めて、そのアプリケーション シナリオを紹介し、読者の参考となる具体的なコード例を示します。 MySQL トランザクションの原則: My

MongoDB テクノロジー開発で遭遇するトランザクション管理問題の解決策の分析 MongoDB テクノロジー開発で遭遇するトランザクション管理問題の解決策の分析 Oct 08, 2023 am 08:15 AM

MongoDB テクノロジー開発で遭遇するトランザクション管理問題の解決策の分析 最新のアプリケーションがますます複雑かつ大規模になるにつれて、データのトランザクション処理要件もますます高くなっています。 MongoDB は、人気のある NoSQL データベースとして、データ管理において優れたパフォーマンスとスケーラビリティを備えています。ただし、MongoDB はデータの一貫性とトランザクション管理が比較的弱く、開発者にとって課題となっています。この記事では、MongoDB 開発で遭遇するトランザクション管理の問題を調査し、いくつかの解決策を提案します。

Java データベース接続はトランザクションと同時実行をどのように処理しますか? Java データベース接続はトランザクションと同時実行をどのように処理しますか? Apr 16, 2024 am 11:42 AM

トランザクションは、原子性、一貫性、分離性、耐久性などのデータベース データの整合性を保証します。 JDBC は、Connection インターフェイスを使用してトランザクション制御 (setAutoCommit、コミット、ロールバック) を提供します。同時実行制御メカニズムは、ロックまたはオプティミスティック/ペシミスティック同時実行制御を使用して同時操作を調整し、トランザクションの分離を実現してデータの不整合を防ぎます。

PHP PDO のパワーをマスターする: 高度なクエリと更新 PHP PDO のパワーをマスターする: 高度なクエリと更新 Feb 20, 2024 am 08:24 AM

PHP Data Objects (PDO) 拡張機能は、データベース サーバーとの効率的でオブジェクト指向の対話を提供します。高度なクエリおよび更新機能により、開発者は複雑なデータベース操作を実行できるようになり、パフォーマンスとコードの保守性が向上します。この記事では、PDO の高度なクエリ機能と更新機能を詳しく説明し、その強力な機能をマスターする方法を説明します。高度なクエリ: プレースホルダーとバインドされたパラメーターの使用 プレースホルダーとバインドされたパラメーターは、クエリのパフォーマンスとセキュリティを向上させるための重要なツールです。プレースホルダーでは疑問符 (?) を使用してクエリ内の置換可能なパラメーターを表し、バインド パラメーターを使用すると各パラメーターのデータ型と値を指定できます。これらの方法を使用すると、データベース エンジンが事前にクエリを最適化できるため、SQL インジェクション攻撃を回避し、パフォーマンスを向上させることができます。 // プレースホルダー $stmt=$ を使用します

安定したスケーラブルなシステムを構築するためのJava EJBアーキテクチャの詳細な説明 安定したスケーラブルなシステムを構築するためのJava EJBアーキテクチャの詳細な説明 Feb 21, 2024 pm 01:13 PM

EJBとは何ですか? EJB は、サーバー側のエンタープライズクラス Java アプリケーションを構築するためのコンポーネントのセットを定義する Java Platform, Enterprise Edition (JavaEE) 仕様です。 EJB コンポーネントはビジネス ロジックをカプセル化し、トランザクション、同時実行性、セキュリティ、その他のエンタープライズ レベルの懸念事項を処理するための一連のサービスを提供します。 EJB アーキテクチャ EJB アーキテクチャには、次の主要コンポーネントが含まれています。 Enterprise Bean: これは、EJB コンポーネントの基本的な構成要素であり、ビジネス ロジックと関連データをカプセル化します。 EnterpriseBean は、ステートレス (セッション Bean とも呼ばれます) またはステートフル (エンティティ Bean とも呼ばれます) にすることができます。セッション コンテキスト: セッション コンテキストは、セッション ID やクライアントなど、現在のクライアント インタラクションに関する情報を提供します。

See all articles