精华内容
下载资源
问答
  • 编程事务管理

    2021-03-04 05:22:25
    ### 手动完成事务管理```通过手动编写代码的方式完成事务的管理(不推荐)```### TransactionTemplate```为了简化事务管理的代码:提供了模板类 TransactionTemplate```### 手动完成事务管理的步骤```1. 配置事务管理器...

    ### 手动完成事务管理

    ```

    通过手动编写代码的方式完成事务的管理(不推荐)

    ```

    ### TransactionTemplate

    ```

    为了简化事务管理的代码:提供了模板类 TransactionTemplate

    ```

    ### 手动完成事务管理的步骤

    ```

    1. 配置事务管理器,Spring使用PlatformTransactionManager接口来管理事务,所以咱们需要使用到他的实现类

    ```

    ```

    2. 配置事务管理的模板

    ```

    ```

    3. 在需要进行事务管理的类中,注入事务管理的模板

    ```

    ```

    4. 在业务层使用模板管理事务

    // 注入事务模板对象

    private TransactionTemplate transactionTemplate;

    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {

    this.transactionTemplate = transactionTemplate;

    }

    public void pay(final String out, final String in, final double money) {

    transactionTemplate.execute(new TransactionCallbackWithoutResult() {

    protected void doInTransactionWithoutResult(TransactionStatus status) {

    // 扣钱

    accountDao.outMoney(out, money);

    int a = 10/0;

    // 加钱

    accountDao.inMoney(in, money);

    }

    });

    }

    ```

    展开全文
  • 一、Spring事务的相关知识1、事务是指一系列独立的操作,但在概念上具有原子性。 比如转账:A账号-100, B账号+100,完成。这两个操作独立是没问题的。 但在逻辑上,要么全部完成,要么一起失败。1)jdbc事务:每个...

    一、Spring事务的相关知识

    1、事务是指一系列独立的操作,但在概念上具有原子性。 比如转账:A账号-100, B账号+100,完成。这两个操作独立是没问题的。 但在逻辑上,要么全部完成,要么一起失败。

    1)jdbc事务:每个Connection都带有一个事务,只是默认被设置为自动提交。一个连接可以有多个事务。对于JDBC,只有在同一个连接内,才有讨论是否提交的前提。

    2)Hibernate事务:本质上也是使用JDBC来处理事务。但是不是直接操作,而是使用Session来操作事务。Session.getTranction();

    ####事务应该要在service层(也可以叫事务层)进行控制。

    为什么用Spring来进行事务控制?

    如果要手动进行控制事务的话,对于JDBC,service层需要Connection;对于Hibernate,serivice层需要Session。若一个项目要实现JDBC和Hibernate或其他的互换,我们要做Service层修改很多东西;而且对于Service层来说,他应该关心的不应该是这些,而是业务逻辑。因此,首先手动控制不能实现组件的替换,其次这些API也不应该出现在service层,但是Spring的IOC很好的解决了这样的问题。

    2、JavaEE传统事务有两种策略:全局事务和局部事务。全局事务由应用服务器管理,需要底层服务器JTA支持(如WebLogic、JBoss等)。局部事务和底层采用的持久化技术有关:当采用JDBC持久化技术时,需要使用Connetion对象来操作事务;而采用Hibernate持久化技术时,需要使用Session对象来操作事务。

    全局事务可以跨多个事务性的资源(典型例子是关系数据库和消息队列);使用局部事务,应用服务器不需要参与事务管理,因此不能保证跨多个事务性资源的事务的正确性。当然,实际上大部分应用都使用单一事务性的资源。

    Spring事务策略是通过PlatformTransactionManager接口体现的,该接口是Spring事务策略的核心,是一个与任何事务策略分离的接口,随着底层不同事务策略的切换,应用必须采用不同的实现类。结合Spring的IoC容器,可以向该接口注入相关的平台特性。

    3、Spring的事务管理,主要有两种方式实现,一种是在代码中编写(编程式事务管理),一种是声明式事务(又可分为AOP式事务管理和注解式事务管理)。在代码中编写要更加细粒度,而很多时候我们只需要简单的事务处理,那就可以用声明式事务。

    Spring的事务管理器:

    事务管理器实现

    目标

    org.springframework.jdbc.datasource.DataSourceTransactionManager

    在JDBC DataSource中管理事务

    (须注入数据源datasource Bean参数)

    org.springframework.orm.hibernate.HibernateTransactionManager

    管理Hibernate事务

    (须注入SessionFactory Bean参数)

    org.springframework.orm.jdo.JdoTransactionManager

    管理JDO事务

    org.springframework.transaction.jta.JtaTransactionManager

    使用一个JTA管理事务,在一个事务跨越多个资源时必须使用

    (无须注入参数)

    org.springframework.orm.ojb.PersistenceBrokerTransactionManager

    管理Apache的OJB事务

    这些事务管理器的的父接口都是PlatformTransactionManager.Spring的事务管理机制是一种典型的策略模式,PlatformTransactionManager代表事务管理接口(该接口定义了下面所说的三个方法),他并不知道底层如何管理事务,他只要求事务管理的实现类提供开始事务(getTransaction())、提交事务(commit())、回滚事务(rollback()),但具体如何实现则交给具体的实现类完成——不同的实现类代表不同的事务管理策略。

    说明:

    1、JTA事务管理器无须注入参数,是因为全局事务的JTA资源由JAVA EE服务器提供,而Spring容器能自行从JAVA EE服务器中获取该事务资源,所以无须使用依赖注入来配置。

    2、当使用JTA全局事务策略时,实际底层须应用服务器支持,而不同的应用服务器所提供的JTA全局事务可能存在细节上的差异,因此实际配置全局事务管理器是可能需要使用JtaTransactionManager的子类,如:OC4JtaTransactionManager(Oracle提供的应用服务器)、WebLogicJtaTransactionManager(Bea提供的WebLogic)、UowJtaTransactionManager(IBM提供的WebSphere)等

    二、Spring编程式事务示例

    步骤一、编写spring配置文件

    下面实例使用DataSourceTransactionManager来管理JDBC事务。

    查看Spring的配置信息:(applicationContext.xml):

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    class="org.springframework.beans.factory.config.

    PropertyPlaceholderConfigurer">

    connect.properties

    ${db.driver}

    ${db.url}

    ${db.username}

    ${db.password}

    class="org.springframework.jdbc.datasource.

    DataSourceTransactionManager"scope="singleton">

    class="org.springframework.transaction.support.

    TransactionTemplate">

    上 面代码中配置了一个org.springframework.transaction.support.TransactionTemplate实例,要 在代码中添加事务,Spring为我们提供了一种方法就是使用TransactionTemplate类。我们要为 TransactionTemplate装配一个TransactionManager,

    如果是要配置Hibernate事务,要进行如下配置:(配置一个sessionFactory):

    HibernateTransactionManager" scope="singleton">

    如果是要配置JTA事务,要进行如下配置(无须参数):

    class="org.springframework.transaction.jta.JtaTransactionManager" scope="singleton" >

    步骤二、使用TransactionTemplate进行事务管理:

    package com.sunflower.dao;

    import java.sql.ResultSet;

    import java.sql.SQLException;

    import org.springframework.jdbc.core.JdbcTemplate;

    import org.springframework.jdbc.core.RowCallbackHandler;

    import org.springframework.transaction.TransactionStatus;

    import org.springframework.transaction.support.TransactionCallback;

    import org.springframework.transaction.support.TransactionTemplate;

    import com.sunflower.entity.People;

    public class BankDaoImp implements BankDao {

    private JdbcTemplate jdbcTemplate;

    private TransactionTemplate transactionTemplate;

    public JdbcTemplate getJdbcTemplate() {

    return jdbcTemplate;

    }

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {

    this.jdbcTemplate = jdbcTemplate;

    }

    public TransactionTemplate getTransactionTemplate() {

    return transactionTemplate;

    }

    public void setTransactionTemplate(TransactionTemplate transactionTemplate) {

    this.transactionTemplate = transactionTemplate;

    }

    @Override

    public double getMoney(final People people) {

    double money = people.getMoney();

    // 开始事务,如果出现状况则回滚

    transactionTemplate.execute(new TransactionCallback() {

    @Override

    public People doInTransaction(TransactionStatus ts) {

    try {

    final People people2 = new People();

    // 使用JdbcTemplate进行持久化层操作

    String sql = "select money from bank where name = ?";

    Object[] params = new Object[] { people.getName() };

    // 查询

    jdbcTemplate.query(sql, params, new RowCallbackHandler() {

    @Override

    public void processRow(ResultSet rs)

    throws SQLException {

    people2.setMoney(rs.getDouble("money"));

    System.out.println(people.getName() + "用户还有"

    + rs.getDouble("money") + "元余款");

    System.out.println(people.getName() + "要从账户中取出"

    + people.getMoney() + "元");

    if (people2.getMoney() < people.getMoney()) {

    System.out.println("余额不足");

    people.setMoney(-1);

    return;

    }

    }

    });

    if (people.getMoney() < 0)

    return null;

    else {

    sql = "update bank set money = ? where name = ?";

    Object[] params2 = new Object[] {

    people2.getMoney() - people.getMoney(),

    people.getName() };

    jdbcTemplate.update(sql, params2);

    System.out.println("剩余余额:"

    + (people2.getMoney() - people.getMoney()));

    }

    }

    catch (Exception e) {

    ts.setRollbackOnly();

    }

    // 如果成功,事务被提交

    return people;

    }

    });

    return people.getMoney();

    }

    }

    调 用TransactionTemplate实例的execute()方法将执行包含在TransactionCallback实例里的代码。如果代码出现 异常,调用TransactionStatus对象的setRollbackOnly()将事务回滚。否则,如果doInTransaction()方法 正常返回,事务将被提交。

    展开全文
  • Java学习-编程式的事务管理编程事务提供了TransactionTemplate 模板类,该类可以大大减少事务操作的代码。因此TransactionTemplate 采用Callback 避免让开发者重复书写其打开事务、提交事务及回滚事务等代码,同时...

    Java学习-编程式的事务管理

    编程式事务提供了TransactionTemplate 模板类,该类可以大大减少事务操作的代码。因此TransactionTemplate 采用Callback 避免让开发者重复书写其打开事务、提交事务及回滚事务等代码,同时TransactionTemplate 无须书写大量的try..catch 块。

    9e5379f359c1ce06c3c78ccfb363120e.png

    HibernateTemplate 必须提供PlatformTransactionManager 实例。该实例既可以在代码中手动设置,也可以使用Spring 的依赖注入。总之,只要获取了PlatformTransactionManager 引用, TransactionTemplate 就可以完成事务操作。

    使用TransactionTemplate 不需要显式地开始事务,甚至不需要显式地提交事务。这些步骤都由模板完成。但出现异常时,应通过TransactionStatus 的setRollbackOnly 显式回滚事务。

    TransactionTemplate 的execute 方法接收一个TransactionCallback 实例。Callback 也是Spring 的经典设计,用于简化用户操作,下面兄弟连www.lampbrother.net 就帮大家总结了一些TransactionCallback 包含的方法:如下。

    • Object dolnTransaction(TransactionStatus status) 。

    该方法的方法体就是事务的执行体。

    如果事务的执行体没有返回值,则可以使用TransactionCallbackWithoutResultl类的实例。这是个抽象类,不能直接实例化,只能用于创建匿名内部类。它也是TransactionCallback 接口的子接口,该抽象类包含一个抽象方法:

    • void dolnTransactionWithoutResult(TransactionStatus status)该方法与dolnTransaction 的效果非常相似,区别在于该方法没有返回值,即事务执行体无须返回值。

    在下面的示例中, PlatformTransactionManager 实例采用适用于Hibernate 的事务管理器来实现类HibernateTransactionManager,该实现类是个局部事务管理器,容器中仅仅部署了该事务管理器bean ,因此应在代码中于动为TransactionTemplate 注入事务管理器bean。下面是Hibernate 局部事务管理的配置文件的源代码:

    UBL工C "-//SPRING//DTD BEAN//EN"

    ''http://www.springfrarnework.org/dtd/sp工rng-beans.dtd">

    corn.rnysql.jdbc.Driver

    jdbc:rnysql://wonder:3306/j2ee

    root

    pass

    lee/MyTest.hbm.xml

    org.hibernate.dialect.MySQLDialect

    update

    下面是采用TransactionTemplate和HibemateTemplate的事务操作代码:

    public class TransactionTest

    {

    public static void main(String[] args)

    {

    //因为并未在web 应用中测试,故需要手动创建Spring 的上下文

    final ApplicationContext ctx = new FileSystemXrnlApplicationContext("bean.xml");

    //获得Spring 上下文的事务管理器

    PlatformTransactionManager transactionManager=(PlatformTransactionManager)ctx.getBean("transactionManager");

    final SessionFactory sessionFactory = (SessionFactory)ctx.getBean("sessionFactory");

    //以事务管理器实例为参数,创建TransactionTemplate对象

    TransactionTemplate tt = new TransactionTemplate(transactionManager);

    //设置TransactionTemplate的事务传播属性

    tt. setPropagationBehavior (TransactionDefinition.PROPAGATION_REQUlRED);

    //执行TransactionTemplate的execute方法,该方法需要TransactionCallback实例

    tt.execute(new TransactionCallbackWithoutResult()

    //采用TransactionCallbackWithoutResult匿名内部类的形式执行

    protectedvoid dolnTransactionWithoutResult(TransactionStatus ts)

    try

    {

    //以SessionFactory 实例为参数创建HibernateTemplate

    HibernateTemplate hibernateTemplate =

    new HibernateTemplate(sessionFactory);

    MyTestpl =丑ew MyTest ("Jack");

    //保存第一个实例

    hibernateTemplate.save(pl);

    //让下面的数据库操作抛出异常即可看出事务效果。前面的操作也

    //不会生效

    MyTestp2 = new MyTest ("Jack");

    //保存第二个实例,可将Person 的name 属性设为标识属性,并

    //引起主键重复的异常,可看出前一条记录也不会加入数据库中

    hibernateTemplate.save(p2);

    }

    catch (Exception e)

    {

    ts.setRollbackOnly();

    }

    }

    });

    }

    }

    展开全文
  • https://blog.csdn.net/qq_32331073/article/details/76508147更多Spring事务问题请访问链接:Spring事务回滚问题疑难详解在此,首先我们要明确RuntimeException与Exception之间的关系与他们分别的含义:①在Java中...

    原文:https://blog.csdn.net/qq_32331073/article/details/76508147

    更多Spring事务问题请访问链接:Spring事务回滚问题疑难详解

    在此,首先我们要明确RuntimeException与Exception之间的关系与他们分别的含义:

    ①在Java中异常的基类为Throwable,他有两个子类Exception与Errors,同时RuntimeException就是Exception的子类;

    ②RuntimeException,即运行时异常,为非受检(UNCHECKED)异常;

    ③Exception的其他子类异常,为非运行时异常,为受检异常(CHECKED)异常;

    1,Spring事务回滚机制是这样的:当所拦截的方法有指定异常抛出,事务才会自动进行回滚!

    我们需要注意的地方有四点: 如果你在开发当中引入Spring进行事务管理,但是事务没能正常的自动回滚,可以对照下面四点,缺一不可!

    ①被拦截方法-—— 注解式:方法或者方法所在类被@Transactional注解;

    拦截配置式:应该包含对该方法,名称格式的定义;

    且方法需要在expression定义的范围内;

    ②异常—— 该方法的执行过程必须出现异常,这样事务管理器才能被触发,并对此做出处理;

    ③指定异常——  默认配置下,事务只会对Error与RuntimeException及其子类这些UNChecked异常,做出回滚。

    一般的Exception这些Checked异常不会发生回滚(如果一般Exception想回滚要做出配置);

    如果你不知道哪些是RuntimeException或者你觉得在默认配置下发生一般的Exception,事务也能如愿回滚,请访

    举例:实现一般异常的回滚:

    注解式:

    @Transactional(rollbackFor=Exception.class)

    @RequestMapping("consump")

    public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{

    拦截配置式:

    @RequestMapping("consump")

    public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{

    ④异常抛出—— 即方法中出现的指定异常,只有在被事务管理器捕捉到以后,事务才会据此进行事务回滚;

    1,不捕捉,会回滚:

    public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{

    int a=consumpDao.insert(s);

    int b=customerDao.update(customer);

    }

    2,如果异常被try{}捕捉到,那么事务管理器就无法再捕捉异常,所以就无法做出反应,事务不回滚;

    public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{

    try{

    int a=consumpDao.insert(s);

    int b=customerDao.update(customer);

    }catch(RuntimeException){

    }

    }

    3,如果异常被try{}捕捉了,我们还可以在Catch(){}中throw   new  RuntimeException(),手动抛出运行时异常供事务管理器捕捉;

    public void insertConsumption(Customer c,Consumption s,Mygift m) throws Exception{

    try{

    int a=consumpDao.insert(s);

    int b=customerDao.update(customer);

    }catch(){

    throw new RuntimeException();

    }

    }

    2,在实际开发中,有时并没有异常发生,但是由于事务结果未满足具体业务需求,所以我们不得不手动回滚事务!

    有如下两种方法:

    ①手动抛出异常(如果你没有配置一般异常事务回滚,请抛出运行时异常)

    int a=consumpDao.insert(s);

    int b=customerDao.insert(customer);

    int d=0;//制造未被满足的业务需求

    if(a*b*d==1){

    json.put("result",0);

    json.put("msg", "购买成功");

    json.put("data", "");

    }else{

    json.put("result",-1);

    json.put("msg", "购买失败");

    json.put("data", "");

    throw new RuntimeException();

    }

    ②编程式实现手动回滚

    int a=consumpDao.insert(s);

    int b=customerDao.insert(customer);

    int d=0;//制造未被满足的业务需求

    if(a*b*d==1){

    json.put("result",0);

    json.put("msg", "购买成功");

    json.put("data", "");

    }else{

    json.put("result",-1);

    json.put("msg", "购买失败");

    json.put("data", "");

    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

    }

    注意:尽管可以采用编程式方法回滚事务,但“回滚”只是事务的生命周期之一,所以要么编程实现事务的全部必要周期,要么仍要配置事务切点,即,将事务管理的其他周期交由Spring的标识!

    展开全文
  • 第五章 事务、视图、索引、备份和恢复 一、什么是事务 事务是一种机制,一个操作序列,包含了一组数据库的操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么执行要么不...
  • 编程事务管理2)声明式事务管理多线程事务解决1)定义线程外集合,将线程处理结果放入集合,由外部线程处理2)定义线程外手动事务集合,将线程事务放入集合,由外部线程处理事务 1. 什么是事务事务是逻辑上的一...
  • 匿名用户1级2018-08-20 回答看你是什么事务,jdbc事务,还是分布式事务,还是容器事务1,编程事务管理(jdbc的事务是绑定在connection上的)Connection conn = null;try{Class.forName("com.mysql.jdbc.Driver");...
  • 手动开启事务,提交和管理 添加依赖 compile "org.springframework.boot:spring-boot-starter-data-jpa" 在service层注入PlatformTransactionManager和TransactionDefinition @Autowired Pl
  • Java中的事务及使用

    2021-03-04 08:05:41
    事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务事务开始(begin transaction...
  • 直到手动删除。 持久顺序节点(PERSISTENT_SEQUENTIAL) 它的基本特性同持久节点,不同在于增加了顺序性。父节点会维护一个自增整性数字,用于子节点的创建的先后顺序。 临时节点(EPHEMERAL) 临时节点的生命周期与...
  • java事务详解

    2021-03-16 22:40:28
    事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务事务开始(begin transaction...
  • Spring事务管理Spring支持两种方式的事务管理:编程事务管理: 通过Transaction Template手动管理事务,实际应用中很少使用,使用XML配置声明式事务: 推荐使用(代码侵入性最小),实际是通过AOP实现实现声明式事务...
  • 前言spring事务管理包含两种情况,编程事务、声明式事务。而声明式事务又包括基于注解@Transactional和tx+aop的方式。那么本文先分析编程式注解事务和基于注解的声明式事务编程事务管理使用...
  • 这篇文章主要介绍了java Spring事务回滚的相关资料,需要的朋友可以参考下spring 事务回滚1、遇到的问题当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误。伪代码如下:public method() {...
  • Spring-Java事物回滚失效处理最近在做项目中,无意间发现有个类在抛事物回滚操作,数据也正常的插入到数据库当中了,于是仔细查看看一下具体原因。一切还是要从Java的检查型异常和非检查型异常说起。那么什么是检查...
  • Spring编程事务TransactionTemplate与DataSourceTransactionManager Spring提供了@Transactional(rollbackFor = Exception.class)声明式事务,他非常的简单且好用,但是也有他失效的时候比如: 在多线程中 私有方法中...
  • Netty 是一款基于 Java 的网络编程框架,能为应用程序管理复杂的网络编程、多线程处理以及并发。Netty 隐藏了样板和底层代码,让业务逻辑保持分离,更加易于复用。使用 Netty 可以得到一个易于使用的 API,让开发...
  • spring 事务回滚1、遇到的问题当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误。伪代码如下:public method() {Dao1.save(Person1);Dao1.save(Person2);Dao1.save(Person2);//假如这句...
  • Java 事务

    2021-03-18 08:57:47
    事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务事务开始(begin transacti...
  • 26 *27 * 如果出现上述情况,则可以使用编程事务管理(也就是手动控制事务)28 * 在controller逻辑开始之前手动开启/获取事务,然后在controller逻辑结束后再根据需要提交或者回滚事务;29 * 在AOP中也是如此,在...
  • 之前在Github上收获15K+star的Java核心神技(这参数,质量多高就不用我多说了吧)非常全面,包含基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库...
  • (一)问题的引出、主要解决手段在线程中使用 batchupdate ,中的每一条记录都会自动的commit(但仍使用一个数据库连接会话,有点像hibernate一级缓存的概念,多个事务,一个会话),如果有异常,则只有异常的数据执行...
  • java事务总述

    2021-11-05 09:09:33
    java事务总述 一、java事务概述 1.1、java事务简述 1、简介 事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列SQL操作,这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行。如果任何一个SQL操作...
  • GitHub 17k Star 的Java工程师成神之路,不来理解一下吗!GitHub 17k Star 的Java工程师成神之路,真...事务管理在零碎开发中是不可短少的一部分,Spring提供了很好事务管理机制,次要分为编程事务和申明式事务两...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,535
精华内容 15,014
关键字:

java手动编程事务

java 订阅