在触发思考

在触发思考

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

        读到周洲同学的博客,看到一篇关于触发器的文章,是在用户充值时,须要在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之间还能够容得下其它操作,那就没有什么意义了.

 

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

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117075.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android开发之提高应用启动速度_splash页面瞬间响应_避免APP启动闪白屏

    Application和Activity中的onCreate都进行了优化,基本没有耗时操作,但是启动应用之后还是会闪现一下白色背景,然后才进入Splash页面,对比了一下QQ、微信、微博等客户端,点击之后都是瞬间响应Splash启动页,差别在哪里呢。其实就算你onCreate啥都不做,仍然会闪一下白屏,因为初始化解析界面时需要一定时间,解决方法是自定义Theme。自定义如下AppSplash” p

    2022年3月11日
  • springboot+idea热部署(自动刷新)

    springboot+idea热部署(自动刷新)近来在使用idea做springboot的项目,但是发现每次修改之后我都需要重新将项目关闭再开启,这样比较繁琐,发现通过热部署的方式让我们可以一边修改我们的项目,然后在页面中直接通过刷新展示出来spring为开发者提供了一个名为spring-boot-devtools的模块来使SpringBoot应用支持热部署,提高开发者的开发效率,无需手动重启SpringBoot应用。devtool…

    2022年6月26日
  • OpenCV中的width与widthStep

    OpenCV中的width与widthStep1.在opencv中width表示的是图像的每行像素数,widthstep表示的是存储一行像素需要的字节数,位了快速读取数据,在opencv中一般使widthStep为4的倍数,从而实现字节的对齐,有利于提高运算速度。2.函数的原型为image->widthStep=(((image->width*image->nChannels*(image->depth&~IPL_DEPTH_SIGN)+7)/8)+align-1)&(~(alig

    2022年5月30日
  • 小米nfc模拟加密门禁卡详细图文教程(实测可用)—————– IC ID CUID卡区别

    小米nfc模拟加密门禁卡详细图文教程(实测可用)—————– IC ID CUID卡区别现在小区虽然都加装了智能门,可以通过手机NFC功能开启或者使用钥匙开启,但是有些用户并不知道原来手机是可以当钥匙使用的。今天我们来学习使用小米nfc模拟加密门禁卡,这样手机就可以变成一把钥匙了。以下是小米nfc模拟加密门禁卡步骤。1、非加密卡直接使用小米钱包的门卡模拟功能即可,如果能直接模拟的就不是加密卡。2、NFC手机支持的频段一般为13.56Mhz卡片,如果是其他门禁卡,手机贴上根本没反应的不可以模拟。3、只能模拟卡片的ID,不支持储值消费等功能。部分门禁等系统只认证卡片ID,所以有可能通过

    2022年5月4日
  • Redis五种数据类型[通俗易懂]

    Redis简介悲观锁:在每次去拿数据的时候总是认为别人会修改数据,因此,在每次去拿的时候都会加锁,其它人想来拿就只能被阻塞。乐观锁:心很大,每次去拿数据的时候都不认为别人会修改,在取数据的时候不会加锁,乐观锁可以理解为一种检测机制,只是在更新数据的时候会判断一下别人是否已经修改了,如果已经修改了就放弃此次的更新操作,进行重试。检测方式有两种:一种是版本号,一种是时间戳,乐观锁适用于读多的场…

    2022年4月17日
  • JAVA简历1到三年

    JAVA简历1到三年JAVA开发工程师_3年基本资料求职意向意向职位: Java开发工程师 求职地址:北京期待薪资:面议到岗时间:随时工作性质:全职 目前状况:已离职个人技能1.熟练Java语言基础语法以及面向对象特征。2.熟练Java语言中常用API的使用,如IO,String,Collection等。3.熟练MySQL的增删改查操作以及JDBC数据库连接池的使用。4.熟悉Git这种分布式版本的控制系统的使用。5.熟悉Spring、Springmvc、M

    2022年7月7日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号