事务是啥?在java中如何手工执行事务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了事务是啥?在java中如何手工执行事务相关的知识,希望对你有一定的参考价值。

事务 指作为单个逻辑工作单元执行的一系列操作。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性;
在java中你要手工执行事务,如果是jdbc连接数据库,那么就设置提交的时候手动提交
conn.setAutoCommit(false);//conn 是connection对象
当结束后
conn.commit();
希望对你有帮助
参考技术A 举个例子,银行转账就是一个事物:从A账户减去金额,吧该金额转到B账户中。吧所有操作完成并且数据同步到数据库中,事物才栓完成。但是数据库操作过程中可能发生错误,其中一个操作失败,就会造成A+B账户金额与操作前的有出入,当发生错误后要取消操作(数据库的事物回滚),保证数据的一致性。

手工执行事物:
1、关闭数据库自动提交,
2、数据库操作完成后如果出错:回滚;没有错误:提交
3、记得关闭数据库连接
参考技术B 简单的说个例子吧。比如你要修改数据库中的内容,而且有很多,update1 update2 update3 ,如果3条数据都修改成功这是我们预期的目标,如果update2 删除失败了我们让整个事务内操作的内容全部取消掉。

事务开启
操作1
操作2
操作3
关闭事务
如果出现异常 进行 回滚

Spring - 事务应该在一种方法中提交,但应该在执行数据库事务的其他方法中回滚

【中文标题】Spring - 事务应该在一种方法中提交,但应该在执行数据库事务的其他方法中回滚【英文标题】:Spring - Transaction should commit in one method but should rollback in other methods which does a DB transaction 【发布时间】:2019-05-13 05:40:23 【问题描述】:

在我有一个场景的情况下,如何在 Java 中处理 Spring Transaction:

一个服务方法让我们说methodA()调用另一个方法——methodB()。 从methodB(),我正在做一个验证,如果验证结果为真,我将调用另一个methodC(),这个方法必须被提交,而所有其他方法应该得到回滚,即从methodA()和methodB()完成的事务必须回滚,但是必须提交methodC中的事务,并且不能回滚。

为了回滚我使用的事务 -

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

实时场景 -

当我执行交易时,我会尝试创建一些交易。基于这些交易,我检查其中一个值是否达到阈值点,我需要触发一封邮件。这封邮件是一个数据库事务。所有其他事务必须回滚,只有邮件事务必须持久化。

任何帮助表示赞赏。

编辑:-

类似的问题 -

commit changes in try-catch inside @Transactional

但这并不能解决我的问题。如果@Transactional 也在类级别和方法级别给出怎​​么办?

【问题讨论】:

【参考方案1】:

在我看来,这样的代码

@Transactional(propagation= Propagation.REQUIRED)
public void methodA() 
    methodB();


public void methodB() 

    if(validtaion=true)
        SeverB.methodC();
        throw YourException;
    


// in ServerB.java
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodC() 
    // do your thing

而且,你最好测试一下它是否运作良好。

【讨论】:

我尝试过使用这种方法,但效果仍然不佳。有一个类级别的@Transaction,我在其中调用methodC()。我猜这可能是一个障碍。不知道如何解决这个问题:( 为了使aop工作。你需要把add @Transactional放在另一个类中。methodB和methodC不在同一个类中。 尝试在另一个类中使用@Transactional - 的methodC()。 我运行我的测试用例,它可以工作。您需要专注于您调用的第一个方法。这个方法把@Transactional.

以上是关于事务是啥?在java中如何手工执行事务的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver中事务的作用是啥?

手工搭建基于ABP的框架 - 工作单元以及事务管理

Spring有几种事务管理,Spring事务管理接口是啥

java事务处理

druid SQL监控里执行时间、最慢、事务中等是啥意思,执行时间分布的[0,4,0,0,0,0,0,0]等又是啥意思?

使用Spring注解方式管理事务与传播行为详解