对触发器的思考

Jun 07, 2016 pm 04:06 PM
について ブログ 考える 引き金 引き金

读到周洲同学的博客,看到一篇关于触发器的文章,是在用户充值时,需要在t_reCharge表中插入一条记录,同时更新t_card表以保证数据一致性.我们当时没想特别多,没想到触发器,就是写了多条sql语句,为了不出错后来使用了事务或存储过程,没记错的话是放在存储过程里

读到周洲同学的博客,看到一篇关于触发器的文章,是在用户充值时,需要在t_reCharge表中插入一条记录,同时更新t_card表以保证数据一致性.我们当时没想特别多,没想到触发器,就是写了多条sql语句,为了不出错后来使用了事务或存储过程,没记错的话是放在存储过程里了。她是这么实现的:

"recharge表中保证提取的是最新一条充值记录,card表中保证更新的记录满足卡号等于充值卡号。"

<spanstyle="font-family:FangSong_GB2312;">CREATETRIGGER[dbo].[CardCash]
  on [dbo].[T_Recharge]
  for Insert
 AS
  BEGIN
  UPDATE T_Card set sCash  =sCash +(select top 1 rAdd  fromT_Recharge order by rNo desc) WhereT_Card .cNo in (select top 1 cNo  fromT_Recharge order by rNo desc )  
  END</span>
ログイン後にコピー

原文链接如下:

给D层减负-存储过程与触发器的使用

看到这儿,心里挺佩服小师妹的,不过我还有两个问题:

1. sql语句是硬伤,我可不可以传参呢?

2. 如果有两个卡同时充值,会不会查询到的t_reCharge最新记录是另一个卡的?换句话说,update和insert孰先孰后?其实我一直也没想明白两个卡同时充值到底先插入哪条记录?

3. 如果2中的触发器本身就是事务,保证了要么都执行要么都不执行,就没有这个问题.否则,是不是考虑加上事务呢?

接下来进一步了解了触发器的工作原理。

由于使表中数据发生变化的操作有插入、更新和删除,所以触发器可以分为三类:INSERT触发器、UPDATE触发器和DELETE触发器。

1.INSERT触发器

当试图向表中插入记录时,INSERT触发器(如果有)自动执行,此时系统自动创建一个inserted表,新的记录被添加到触发器表和inserted表。触发器可以检查inserted表,确定是否执行触发器动作和如何执行触发器动作。

2.DELETE触发器

当试图从表中删除信息时,DELETE触发器被触发,此时系统自动创建一个deleted表,被删除的行被放置到这个特殊的表中。被删除的行在触发器表中将不再存在。因此,触发器表和deleted表之间没有共同的记录。

3.UPDATE触发器

UPDATE语句可以看成两步,删除一条旧记录,插入一条新记录。所以,UPDATE触发器被触发时,自动创建一个deleted表和一个inserted表,UPDATE语句使原始行移入deleted表,将更新行插入到inserted表中。

我们这里是一个insert触发器,那为什么用触发器?用一个类似的例子来解释。我们有两个表用来记录商品的出库入库情况,t_good_store记录库存的产品类别和数量,而t_good_out记录出库的产品类别和数量,那么每当我们出库的某个类别的产品一定数量的时候,我们应该在t_good_out中插入该产品的类别和出库数量,同时也应该在t_good_store中用update来更新库存的相应类别的产品的数量;这时我们要完成两个任务:插入t_good_out后更新t_good_store,为避免只操作其中一个而造成数据的不一致,我们可以用触发器,在t_good_out的插入操作上绑定一个对t_good_store更新的触发器。当然这个过程应该是一个事务,这就不必担心插入t_good_out表执行了,而绑定在这个动作上的触发器操作不会执行,因为数据库设计了原子性。

再来看上面的三个问题.

1. 触发器只有在修改(包括插入和删除)时触发,目的是给我们一个做其他动作的机会,它没有在查询数据时做其他动作的能力.问了触发器是否有参数这个问题,说明我刚开始没有理解触发器的这个特性.

另外,根据触发器的工作原理,我们可以访问inserted和deleted这两张临时表,需要明白的是inserted存放进行insert和update操作后的数据;deleted存放进行delete和update操作前的数据.

Update=delete+insert.这一点给我们的启示:DRP系统中有一个页面是修改Item或者client或者flowCard,可以先都删除再都插入,然后提示修改成功,不然那个样子多的条目,如何一条条判断再modify?

2. 关于同时插入两个记录,有人说可以,因为insert是在毫秒级,但是不管什么级都是有先有后啊.又说,insert是rowlevel锁,如果不Lock table的话,也无法确定先后啊.

3. 我认为可以不加事务,触发器要是设计得insert和update之间还可以容得下其他操作,那就没有什么意义了.

我先实验一把,这个空当,就算抛砖引玉了,当然也会默默地、虚心地接受板砖…

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

物理的なジェスチャーを使用して画面上に楽しい FaceTime 効果をトリガーする方法 物理的なジェスチャーを使用して画面上に楽しい FaceTime 効果をトリガーする方法 Oct 12, 2023 pm 11:49 PM

iOS17 と iPadOS17 では、Apple は iPhone と iPad にメッセージのような FaceTime 反応を導入しました。メニューからアイコンを選択する代わりに、FaceTime 通話中に物理的なジェスチャーでアイコンをトリガーできます。 iOS 17 を実行している iPhone または iPadOS 17 を実行している iPad で FaceTime ビデオ通話を行う場合、ハート、風船、紙吹雪、花火などの画面効果をトリガーできます。視覚効果は、FaceTime 通話ビデオのディスプレイ全体に表示されます。時には他の人が見ても素晴らしいものになります。ハンズフリーなので、物理的なジェスチャーのみを使用してこれらの反応を引き起こすことができます。たとえば、親指を立てる

ゼロから始めて、Flask をインストールし、個人ブログを迅速に確立する方法を段階的にガイドします。 ゼロから始めて、Flask をインストールし、個人ブログを迅速に確立する方法を段階的にガイドします。 Feb 19, 2024 pm 04:01 PM

ゼロから始めて、Flask をインストールし、個人ブログをすぐに構築する方法を段階的に説明します。書くことが好きな人にとって、個人ブログを持つことは非常に重要です。軽量の Python Web フレームワークである Flask は、シンプルで完全に機能する個人ブログを迅速に構築するのに役立ちます。この記事では、ゼロから始めて、Flask をインストールして個人ブログを迅速に構築する方法を段階的に説明します。ステップ 1: Python と pip をインストールする 開始する前に、まず Python と pi をインストールする必要があります

Mac の FaceTime でリアクションエフェクトを刺激する方法 Mac の FaceTime でリアクションエフェクトを刺激する方法 Oct 10, 2023 pm 06:09 PM

macOS Sonoma で、Apple は FaceTime にメッセージのような反応を導入しました。ただし、テキストによってトリガーされる代わりに、ジェスチャーによってトリガーすることもできます。 macOS Sonoma 以降を実行している Mac で FaceTime ビデオ通話を行うと、ハート、風船、紙吹雪、花火などの画面効果をトリガーして、FaceTime 通話ウィンドウのディスプレイをあふれさせることができます。これらのレイヤー スクリーン効果は、緑色の FaceTime メニュー バー項目を介してトリガーできます。これには、ミニ Web カメラ ビューと反応をトリガーするボタンが含まれています。また、ハンズフリーにして、物理的なジェスチャーだけを使用して同じ反応をトリガーすることもできます。たとえば、親指を立てるといいね、2 がトリガーされます。

パワーポイントでクリックするまでテキストを非表示にする方法 パワーポイントでクリックするまでテキストを非表示にする方法 Apr 14, 2023 pm 04:40 PM

PowerPoint でクリックする前にテキストを非表示にする方法 PowerPoint スライド上の任意の場所をクリックしたときにテキストを表示したい場合、設定はすばやく簡単です。 PowerPoint でボタンをクリックする前にテキストを非表示にするには: PowerPoint ドキュメントを開き、[挿入] メニューをクリックします。 「新しいスライド」をクリックします。 [空白] または他のプリセットのいずれかを選択します。 [挿入] メニューで [テキスト ボックス] をクリックします。テキスト ボックスをスライド上にドラッグします。テキストボックスをクリックして、あなたの名前を入力してください

2022 年のオープンソース PHP ブログ システムのトップ 10 は何ですか? 【推薦する】 2022 年のオープンソース PHP ブログ システムのトップ 10 は何ですか? 【推薦する】 Jul 27, 2022 pm 05:38 PM

ブログとは、ウェログ、ブログ、ブログとも訳され、通常は個人によって運営され、随時新しい記事が投稿されるウェブサイトです。では、どうやってブログを開設すればいいのでしょうか? PHP ブログ システムとは何ですか?どのブログ システムを使用するのが最適ですか?以下の PHP 中国語 Web サイトでは、トップ 10 のオープンソース PHP ブログ システムを要約して共有します。

シンプルなブログを作成する: PHP と SQLite を使用する シンプルなブログを作成する: PHP と SQLite を使用する Jun 21, 2023 pm 01:23 PM

インターネットの発展に伴い、ブログはますます多くの人々が自分の生活、知識、アイデアを共有するプラットフォームになりました。自分のブログも作成したい場合は、この記事で PHP と SQLite を使用して簡単なブログを作成する方法を紹介します。ニーズを決定する ブログを作成し始める前に、実現したい機能を決定する必要があります。例: ブログ投稿の作成 ブログ投稿の編集 ブログ投稿の削除 ブログ投稿のリストの表示 ブログ投稿の詳細の表示 ユーザー認証と権限制御 PHP と SQLite のインストール PHP と S をインストールする必要があります

イベントのバブリングが 2 回トリガーされるのはなぜですか? イベントのバブリングが 2 回トリガーされるのはなぜですか? Feb 22, 2024 am 09:06 AM

イベントのバブリングが 2 回トリガーされるのはなぜですか?イベント バブリング (イベント バブリング) とは、DOM において、要素がイベント (クリック イベントなど) をトリガーすると、イベントがその要素から親要素にバブルアップし、最後に最上位のドキュメント オブジェクトにバブルアップすることを意味します。イベント バブリングは DOM イベント モデルの一部であり、これにより開発者はイベント リスナーを親要素にバインドできるため、子要素がイベントをトリガーすると、バブリング メカニズムを通じてイベントをキャプチャして処理できます。ただし、開発者は、バブルして 2 回トリガーされるイベントに遭遇することがあります。

iOS 17: FaceTime でリアクションエフェクトをトリガーする方法 iOS 17: FaceTime でリアクションエフェクトをトリガーする方法 Sep 22, 2023 pm 01:25 PM

iOS17 で、Apple は FaceTime にメッセージのような反応を導入しました。ただし、テキストによってトリガーされる代わりに、ジェスチャーによってトリガーすることもできます。 iOS 17 を実行している iPhone で FaceTime ビデオ通話を行うと、ハート、風船、紙吹雪、花火などの画面効果をトリガーして、FaceTime 通話ウィンドウ全体にディスプレイを表示できるようになりました。 FaceTime で画像を長押しすると、反応オプションのメニューが表示され、これらのレイヤー スクリーン効果をトリガーできます。また、ハンズフリーにして、物理的なジェスチャーだけを使用して同じ反応をトリガーすることもできます。たとえば、1 回の親指アップで「いいね」がトリガーされ、2 回の親指アップで花火がトリガーされます。同様に、サムダウンはカウントされません

See all articles