千家信息网

Java Spring声明式事务是什么

发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,这期内容当中小编将会给大家带来有关Java Spring声明式事务是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。项目结构:表结构:基于xml的声明式事务配置I
千家信息网最后更新 2025年11月11日Java Spring声明式事务是什么

这期内容当中小编将会给大家带来有关Java Spring声明式事务是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

    项目结构:


    表结构:


    基于xml的声明式事务配置

    IAccountDao.java:

    package tx.dao;import java.math.BigDecimal;public interface IAccountDao {    void add(String name, BigDecimal money);    void sub(String name, BigDecimal money);}

    AccountDaoImpl.java:

    package tx.service.impl;import tx.dao.IAccountDao;import tx.service.IAccountService;import java.math.BigDecimal;public class AccountServiceImpl implements IAccountService {    private IAccountDao accountDao;    public void setAccountDao(IAccountDao accountDao) {        this.accountDao = accountDao;    }    @Override    public void tran(String from, String to, BigDecimal money) {        accountDao.sub(from, money);        accountDao.add(to, money);    }}

    IAccountService.java:

    package tx.service;import java.math.BigDecimal;public interface IAccountService {    void tran(String from, String to, BigDecimal money);}

    AccountDaoImpl.java:

    package tx.dao.impl;import org.springframework.jdbc.core.JdbcTemplate;import tx.dao.IAccountDao;import java.math.BigDecimal;public class AccountDaoImpl implements IAccountDao {    private JdbcTemplate jdbcTemplate;    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {        this.jdbcTemplate = jdbcTemplate;    }    @Override    public void add(String name, BigDecimal money) {        jdbcTemplate.update("update account set balance = balance + ? where name = ? ", money.toString(), name);    }    @Override    public void sub(String name, BigDecimal money) {        jdbcTemplate.update("update account set balance = balance - ? where name = ? ", money.toString(), name);    }}
                                                                                                                                                                                                                                                          
    ApplicationContext context = new ClassPathXmlApplicationContext("tx.xml");IAccountService accountService = context.getBean("accountService", IAccountService.class);accountService.tran("小明", "小红", new BigDecimal(500));

    完全注解(零xml)方式配置

    IAccountDao.java:

    package tx.dao;import java.math.BigDecimal;public interface IAccountDao {    void add(String name, BigDecimal money);    void sub(String name, BigDecimal money);}

    AccountDaoImpl.java:

    package tx.dao.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Repository;import tx.dao.IAccountDao;import java.math.BigDecimal;@Repositorypublic class AccountDaoImpl implements IAccountDao {    @Autowired    private JdbcTemplate jdbcTemplate;    @Override    public void add(String name, BigDecimal money) {        jdbcTemplate.update("update account set balance = balance + ? where name = ? ", money.toString(), name);    }    @Override    public void sub(String name, BigDecimal money) {        jdbcTemplate.update("update account set balance = balance - ? where name = ? ", money.toString(), name);    }}

    IAccountService.java:

    package tx.service;import java.math.BigDecimal;public interface IAccountService {    void tran(String from, String to, BigDecimal money);}

    AccountServiceImpl.java:

    package tx.service.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import tx.dao.IAccountDao;import tx.service.IAccountService;import java.math.BigDecimal;@Service@Transactionalpublic class AccountServiceImpl implements IAccountService {    @Autowired    private IAccountDao accountDao;    @Override    public void tran(String from, String to, BigDecimal money) {        accountDao.sub(from, money);        accountDao.add(to, money);    }}

    TXConfig.java

    package tx.config;import com.alibaba.druid.pool.DruidDataSource;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import org.springframework.transaction.annotation.EnableTransactionManagement;import tx.service.IAccountService;import tx.service.impl.AccountServiceImpl;import javax.sql.DataSource;@Configuration@ComponentScan(basePackages = "tx")@EnableTransactionManagementpublic class TXConfig {    /**     * 配置数据源     */    @Bean    public DataSource getDataSource() {        DruidDataSource dataSource = new DruidDataSource();        dataSource.setUrl("jdbc:mysql://localhost:3306/test?useSSL=false");        dataSource.setUsername("root");        dataSource.setPassword("19834044876");        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");        return dataSource;    }    /**     * 创建事务管理器     */    @Bean    public DataSourceTransactionManager getTransactionManager() {        return new DataSourceTransactionManager(getDataSource());    }    /**     * 配置jdbcTemplate对象     */    @Bean    public JdbcTemplate getJdbcTemplate() {        return new JdbcTemplate(getDataSource());    }    @Bean(name = "accountService")    public IAccountService getAccountService() {        return new AccountServiceImpl();    }}
    ApplicationContext context = new AnnotationConfigApplicationContext(TXConfig.class);IAccountService accountService = context.getBean("accountService", IAccountService.class);accountService.tran("小明", "小红", new BigDecimal(500));

    事务参数


    no-rollback-for

    指定碰到哪些异常不需要回滚

    rollback-for

    指定碰到哪些异常需要回滚

    read-only

    设置事务为只读事务

    timeout

    以秒为单位,设置事务超出指定时常后自动回滚

    默认为-1,即不管事务运行多久都不回滚

    isolation

    事务的隔离级别


    默认为DEFAULT,即使用当前数据库的隔离级别

    propagation

    事务的传播行为


    默认为REQUIRED

    上述就是小编为大家分享的Java Spring声明式事务是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

    0