问题描述
我现在写一套进销存系统比如仓库入库,库存表数量也会发生改变这个时候我可以定义一个事务,多条SQL语句执行当然也可以用触发器请问哪个更好点
解决方案
解决方案二:
事务不是回滚用的么,和触发器不一样吧,我也想看看答案
解决方案三:
事务,必须事务,妥妥的事务,坚决不用触发器
解决方案四:
事务吧、万一出错还能回滚。触发器貌似滚不回来,有可能导致数据错误。
解决方案五:
用事务,锁住库存表.否则可能出现多个用户同时操作,脏数据的问题.
解决方案六:
引用楼主maocheng82的回复:
我现在写一套进销存系统比如仓库入库,库存表数量也会发生改变这个时候我可以定义一个事务,多条SQL语句执行当然也可以用触发器请问哪个更好点
用事务多条sql语句,有一个执行失败,这个时候库存是要回滚滴,你用触发器这个不是给自己找麻烦嘛!
解决方案七:
二者没有对立的关系。当你写一条insert语句(并且假设你的应用程序也没有显式地执行BeginTransaction之类的语句),那么sqlserver会自动启动一个事务来执行这条insert语句。而这条语句所引起的触发器的执行,以及触发器中所有的数据更改语句,已经数据改变引起的其它触发器执行动作,以及触发器中调用的存储过程执行,等等等等,当然也还是在这个事务中的!所以触发器一定能会在某个事务中执行,要么就是sqlserver默认地自动地对单个insert语句而启动的事务,要么就是你显式地在代码中启动的事务。实际上,触发器跟事务没有直接关系。但是既然任何insert、update、delete语句都可能引起触发器执行,而这些语句肯定是在事务中执行的,那么触发器肯定也是在事务中执行的。它们之间没有对立的关系。
解决方案八:
我们之所以经常(明明有触发器可用也)不使用触发器,主要有两个原因:1.因为经常需要重构程序,那么将业务操作在自己的开发调试环境所支持的普通的编程环境中开发会更方便。因为不论使用什么关系数据库(或者根本不使用关系数据库),那么脱离了关系数据库的编程方式总是更加通用的。所以我们更习惯于把业务处理写在应用程序中,而往往会仅把数据库当作后备数据的地方(绝不用数据库系统编程)。2.这个原因其实更重要。对于专业开发者,比如说随便搞个电商系统之类的,都知道在c#中跑的核心技术的程序(特别是分布式的一些算法)的效率比存储过程高几十倍,而且大部分时候我们提高系统服务性能的最基本的做法就是避免访问到数据库系统(而使用缓存系统、内存数据库系统、甚至本地文件系统,等等)。对于一些刚刚学习开发小办公室内的OA程序的学生可能觉得“什么都用存储过程来写”非常新潮,甚至他的c#程序要取一下当前机器的本地时间他都可能调用数据库存储过程去取(确实有很多这类的学生)。但是一旦进入互联网公司,就知道必须该开始注重实用性了。
解决方案九:
关于“事务回滚”的问题。在触发器中如果抛出异常,事务自然也就回滚了。触发器代码不会影响事务的封锁和回滚的任何范围。关于“数据一致性”问题,事务中由于数据被改变而触发了触发器执行,那么触发器所访问和更改的数据自然也遵从事务的隔离原则,不会造成数据不一致性。比如说我们insert一条进货信息,触发器去查询库存、更改库存,那么自然这个0.1秒瞬间中相应的库存记录也会被加锁,而不是仅有插入的进货记录被加锁。只不过,我建议尽量不要使用触发器,也不要使用存储过程。这是为了更好地融入比较现代的互联网公司(而不是传统的进销存ERP之类的系统公司)。
解决方案十:
Quote: 引用8楼sp1234的回复:
关于“事务回滚”的问题。在触发器中如果抛出异常,事务自然也就回滚了。触发器代码不会影响事务的封锁和回滚的任何范围。quote]谢谢,关于脏数据本人理解的还是不是很深刻比如我在一个事务里有一条SQL语句,为了防止脏读,我写成updatetable1setsl='10000'WITH(HOLDLOCK)是不是在这个事务运行的过程中table1这个表被锁定了其他用户不能访问只有等这个事务运行完才解锁是这样理解吗谢谢
解决方案十一:
同意sp1234,最好是做到把数据库仅仅当作是一个带有索引(关系数据库)的存储设备使用。
解决方案十二:
另外要注意,在互联网公司中,并不是动不动就去整“数据库事务”这个概念的。实际上互联网公司把它当作一种“毒瘤”,互联网公司之所以可以在最近2、3年突然以每年几十倍的速度发展,主要原因也是跟抛弃了“强一致性”有关。不是说不考虑数据库事务,而是说要了解新型的大系统设计框架来重新设计业务流程。在这个流程中,无一例外地,那些动不动就用“数据库事务中”的概念来套用的,都被当作不合格的程序设计师的设计bug来废弃。比如说你用支付宝去买一件商品,这一个动作可能需要触发200个数据库相关的操作,那么它们都在一个事务中吗?如果要是这样去想,就不存在支付宝了!实际上可能有20个事务(而不是一个事务),而且更多的操作并不是立刻就iu读写数据库的(至少不是立刻就写数据库的),事务概念已经不是一个“八股文”的框框了,新式的分布式计算和业务处理流程设计才是互联网公司打败传统的公司的核心技术,只有掌握了比较现代的程序设计技术的工程师才能用极低的成本运营,以极高的速度推出创新业务。
解决方案十三:
学习
解决方案十四:
以后我也得弄进销存,关注学习下
解决方案十五:
引用4楼Z65443344的回复:
用事务,锁住库存表.否则可能出现多个用户同时操作,脏数据的问题.锁住库存表是不是这样写update库存表setsl='10000'WITH(HOLDLOCK)
解决方案:
这几天我也正在也进销存软件。用的是事务,没有去考虑触发器。一般我用触发器是做数据同步时的分量同步,很有效果,执行效率也高。如果做多个运算的话,还是事务比较靠谱。
解决方案:
引用15楼song_scs的回复:
这几天我也正在也进销存软件。用的是事务,没有去考虑触发器。一般我用触发器是做数据同步时的分量同步,很有效果,执行效率也高。如果做多个运算的话,还是事务比较靠谱。请问你是如何防止脏读的锁住库存表是不是这样写update库存表setsl='10000'WITH(HOLDLOCK)这样可以不在是事务里SQL语句用这样的写法
时间: 2024-10-14 09:20:49