留言与评论(共有 0 条评论) |
发布时间:2020-04-12 08:58:57
这个问题一般是数据锁造成的,INSERT的时候一般不会遇到这种问题,你在A或者B存储过程中查看一下,一定有UPDATE语句或者 SELECT FOR UPDATE语句,两个并发的请求同时锁一条记录就会造成一条成功另一条失败。
不过按照你的描述最大的可能性是另外一种情况,就是两次INSERT插入的数据某个字段是相同的值,好死不死的,这个相同值的字段又设置了唯一索引或者约束,那么当第一条记录插入成功后第二条记录就会必然失败回滚。
存储过程的定义:
一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
通过定义很容易知道存储过程的本质是SQL语集;因此如果你会SQL语句,其实你只需要再学习一些SQL存储过程里面的语法,关键字,你也就会使用存储过程了,和存储过程非常类似的触发器也是如此。
那么它有什么优缺点呢?
还是继续看定义“完成特定功能的SQL 语句集” “经过第一次编译后再次调用不需要再次编译”;是的,它可以完成特定的功能并且只需编译一次。
什么是特定的功能?
例如所有的业务逻辑,以及在进行入库的时候需要统一对入库数据进行格式化处理等等功能。
有过项目开发经历的同学应该知道,当我们将很多业务逻辑写在存储过程里面的时候,我们统一修改业务逻辑会非常方便。
我程序部署到正式服务器环境以后,如果这时候发现业务逻辑有问题,更改程序代码是很危险的事情,用“牵一发而动全身”来形容也不为过,而且由于本地测试代码和发布到正式环境的代码有诸多不同,因此临时更改代码非常危险。
如果我们将业务逻辑写在了存储过程里面,我们甚至无需要重新更改代码,重新编译,重新发布。我们直接更改数据库里面的存储过程就可以完成程序的相应更改,这大大方便了我们发布以后对程序的更改,增强了程序安全性。
因此存储过程的优点1:
什么是编译?
利用编译程序从源语言编写的源程序产生目标程序的过程。
这是编译的定义,我是做C#开发的,每次更改完代码,需要对整个项目重新进行编译,程序才可以看到更改以后的效果,直接写的代码如果不进行编译直接运行,计算机是无法识别的,计算机会在特定的环境下将代码编译成计算机可以识别的中间文件,这样程序才能在计算机上正常运行,这个过程称之为“编译”,每次运行,程序都需要重新进行编译。
但是存储过程经过第一次执行调用编译,后面的调用就无需再进行编译,存储过程在创建的过程中,数据库已经对其进行了一次解析和优化,一旦存储过程执行,内存中也会相应保留一份,下次调用的时候直接调用内存里面的,执行速度就会快很多。
另外由于存储过程直接在数据库服务器上运行,因此可以减少服务器与服务器之间不必要的网络交互,同样也可以提高程序运行的整体速度。
因此存储过程的优点2:
无独有偶,存储过程也有相应的缺点:
那么存储过程有什么缺点呢?
SQL语句本身是一种结构化查询语言,它不是面向对象的的,本质上是过程化的语言,因此SQL语句违背了我们编程的面向对象思想。
面对复杂的业务逻辑,过程化的处理会很吃力。同时SQL擅长的是数据查询而并非业务逻辑处理,如果把业务逻辑全放在存储过程里面,也就违背了这一原则。
因此存储过程缺点1:
我曾经使用PL/SQL调试过存储过程,由于这种语言不是在特定的集成开发环境下运行,因此调试起来非常不方便,出现问题,定位到相应的地方非常吃力。同时大量的使用也让数据库负荷很重。
因此存储过程缺点2:
最后总结:
适当的使用存储过程有一定的好处,优化我们SQL语句执行的性能,实现了业务的分离。但是大量的使用会让服务器运行负荷过重,同时也难以定位相应的业务问题。
留言与评论(共有 0 条评论) |
全站搜索