Java|Java Spring 声明式事务详解

目录

  • 项目结构:
  • 表结构:
  • 基于xml的声明式事务配置
  • 完全注解(零xml)方式配置
  • 事务参数
    • no-rollback-for
    • rollback-for
    • read-only
    • timeout
    • isolation
    • propagation
  • 总结

    项目结构:
    Java|Java Spring 声明式事务详解
    文章图片



    表结构:
    Java|Java Spring 声明式事务详解
    文章图片


    Java|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; }@Overridepublic 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; }@Overridepublic void add(String name, BigDecimal money) {jdbcTemplate.update("update account set balance = balance + ? where name = ? ", money.toString(), name); }@Overridepublic void sub(String name, BigDecimal money) {jdbcTemplate.update("update account set balance = balance - ? where name = ? ", money.toString(), name); }}

    【Java|Java Spring 声明式事务详解】

    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 {@Autowiredprivate JdbcTemplate jdbcTemplate; @Overridepublic void add(String name, BigDecimal money) {jdbcTemplate.update("update account set balance = balance + ? where name = ? ", money.toString(), name); }@Overridepublic 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 {@Autowiredprivate IAccountDao accountDao; @Overridepublic 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 {/*** 配置数据源*/@Beanpublic 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; }/*** 创建事务管理器*/@Beanpublic DataSourceTransactionManager getTransactionManager() {return new DataSourceTransactionManager(getDataSource()); }/*** 配置jdbcTemplate对象*/@Beanpublic 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));


    事务参数 Java|Java Spring 声明式事务详解
    文章图片


    Java|Java Spring 声明式事务详解
    文章图片


    no-rollback-for
    指定碰到哪些异常不需要回滚

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

    read-only
    设置事务为只读事务

    timeout
    以秒为单位,设置事务超出指定时常后自动回滚
    默认为-1,即不管事务运行多久都不回滚

    isolation
    事务的隔离级别

    Java|Java Spring 声明式事务详解
    文章图片


    Java|Java Spring 声明式事务详解
    文章图片

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

    Java|Java Spring 声明式事务详解
    文章图片


    propagation
    事务的传播行为

    Java|Java Spring 声明式事务详解
    文章图片


    Java|Java Spring 声明式事务详解
    文章图片

    默认为REQUIRED
    Java|Java Spring 声明式事务详解
    文章图片


    总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

      推荐阅读