开发中,这里只说单裤的操作。一般情况是两张表有业务联系要确定sql都执行成功才提交事务。但对于不相干的业务表,我在一个方法中只需一条更新sql,是否需要加事务控制?
A更新成功,发送事件,通知B做相应的操作。
参考:领域驱动设计(DDD)的领域事件。
不需要,本身成功就是成功了,不成功就是不成功
这种隔离性的操作就不需要事务了。但往往需不需要,不是根据技术需求,而是业务需求,如果业务关联性强,往往会把sql操作封装起来,要事务就全部使用事务,不用事务就全部不用
为了避免其他人再误解,我举个例子:计算访问量,访问一次在原基础上加1。此回答是基于该想法进行的回答。没有关联,没有业务,单纯的操作数据
需要的.别听上面的乱讲,单接口单语句更新也是需要加事务的.不然并发的时候数据有可能会出现意料之外的问题.
同意,方法是单一的,但是请求可能是有并发的,修改操作建议都加事务
还别听上面乱讲,sql单行操作时,命中索引对索引加锁,没有命中对行加锁,了解下?操作失败不操作不相当于回滚?
@让我发会呆: 单行操作自动添加排他锁,跟并不并发无关,解决并发那是其他解决方案
@TenFly: 你这上面说的两个回复,简直不敢苟同。
什么系统是只有一个人使用,不会出现并发?你的业务接口设计只能串行访问?
楼主说的是基础的增删改查之类的操作,你要是 delete from table_name; 这种操作确实是不需要在事务里,只要是你的更新sql有一点业务逻辑在里面,你不加事务试试,除非你的系统tps非常低,才不太会经常出问题吧。
@让我发会呆: 我觉得了解一下数据库的底层原理比敲一年的CRUD强,数据库在执行更改操作时会加上排他锁,这是一种单例操作,基于楼主的提问“不跟其他业务关联的更新操作”需要什么事务,全都是排着队的请求。事务是更新关联的数据,比如两条数据关联必须同时成功、或者一条数据的更新有执行顺序关系才会使用。
@让我发会呆: 我声明一边我回复的立场,不跟业务关联,单纯的更新没关联的数据
@TenFly: 秒杀场景,一万个人抢两个库存商品,这是单表吧,也是排着队的请求吧,和更新的执行顺序也没关系吧,你来段代码,不要事务控制,也不许加锁,保证不多卖,show me the code
@让我发会呆: 你这不是跟业务挂钩了吗?我一个库存表,每次请求接口数量减1,发一万次,减少一万条,并发一亿次,减少一亿条,单纯的数据更新不需要事务。等你将实际数据跟业务挂钩,像你说的库存不能小于0,这才有使用事务的意义
@让我发会呆: 我懂你回答的意思,只能说审题结果不一致,你看楼主需要的是那种回答
@让我发会呆: 事务不是sql执行中,有一条失败,事务中的所有语句都回滚么? 秒杀场景下, 加上事务, sql语句更新成功了, 东西卖超了,它也能回滚么?
@百鸟朝凤: 当然不能回滚,加事务是可以让你在事务代码里实现你的业务逻辑,保证不会卖超,如果没有事务是很难做到的
@让我发会呆: 那这种, 直接加锁, 然后更新语句加一个where 条件, 库存不能小于0 ,不可以么,不用事务
@百鸟朝凤: 不想讨论这个问题了,博主说的简单sql单表操作,这种事务可加可不加,主要看具体业务,我说的场景也是,库存不能小于0一个where 条件就可以了,那如果单表有很多字段都需要调整,不可能把全部业务逻辑写在sql里吧。
我最初说的修改操作建议都加事务,只是平时的业务开发规范,对于以后的代码维护和代码复用都是有好处的。
@让我发会呆: 嗯嗯, 主要是我原来从来没考虑过这些,一直以为事务就是多条sql执行,其中一条报错, 全部回滚, 没考虑到在事务中加业务代码, 所以多问了两句
@百鸟朝凤: 事务其实就是多条sql执行,其中一条报错, 全部回滚, 我是搞java的,一般使用都是spring的事务管理器,这个事务回滚功能其实也就是使用数据库的rollback。
事务里一般做的加锁读,还需要考虑到数据库的不同隔离级别,就是那些不可重复度、幻读、写倾斜那些怎么处理,spring的事务还有7种传播机制,事务与事务之间的处理。
你要是有幸遇到业务上面的事务不一致问题,带着问题去分析,就更好玩了 = =
@让我发会呆: 我的理解是, 我要执行sql语句,前提是我的业务逻辑判断一般都完成之后才会执行,怎么会出现在事务中写业务逻辑呢,就像那个秒杀,我应该是先判断目前的库存,如果大于0, 我才执行sql语句啊, 我不会先执行sql, 然后再判断库存,发现库存不对再回滚,,,,
可能是我遇到的业务场景太少了,大部分都是增删查改, 还没啥大并发的场景,单纯考想,还真想不出这种场景
@百鸟朝凤: 兄弟,你要是在开始事务之前先做业务逻辑判断,那是没用的,因为等你进去事务去执行sql的时候,数据库里面的数据可能已经修改了,已经不满足你之前做的逻辑判断了,你必须要事务里 在加锁读之后做业务逻辑判断,才可能不会出问题。
事务是一组SQL语句,要么全部执行成功,要么全部回滚到之前的状态。事务可以确保数据库的一致性和完整性。在一般情况下,如果你需要确保一组SQL语句的原子性,即要么全部执行成功,要么全部失败,那么你应该使用事务。
对于单个更新SQL语句,是否需要放在事务中取决于你的业务逻辑和要求。以下是一些建议:
独立业务:
如果你的更新SQL与其他业务无关,而且没有依赖于其他SQL的结果,可能可以独立执行,而无需放在事务中。
原子性需求:
如果你的业务要求一组SQL操作要么全部成功,要么全部失败,即保持原子性,那么你应该将它们放在事务中。
数据一致性:
如果你的业务需要确保多个表之间的数据一致性,即使是单个更新语句,也可能需要考虑放在事务中。
异常处理:
如果你需要在发生错误时回滚到之前的状态,并执行一些异常处理逻辑,那么使用事务是合适的。
并发控制:
在多用户环境中,使用事务可以帮助进行并发控制,确保在同一时刻只有一个用户对数据进行修改。
总的来说,如果你的业务需要原子性、数据一致性,或者有异常处理的需求,那么考虑将单个SQL语句放在事务中。如果你确定这个SQL操作是独立的,没有与其他业务相关的依赖,并且不需要原子性,那么也可以选择不使用事务。在数据库设计和开发中,根据具体情况灵活运用事务是很重要的。
你好,在"并发控制"中你的意思是"事务可以确保同一时刻只有一个用户对数据进行修改"吗?但是我觉得数据在被修改的时候是加了“写锁”的,即便我不开启事务,同一时刻也只能有一个用户对数据进行修改。"同一时刻只有一个用户对数据进行修改"这个好处是和锁有关系,和事务没关系吧?
简单讲,如果考虑并发,那么就要事务和隔离,不考虑就随便写
一个方法一个sql是否需要加事务控制取决于多种因素。数据一致性上来说,你需要开启 例如mysql的事务。
– CallMeEureka 1年前差不多,可以结贴了吧,哈哈……
– 让我发会呆 1年前