深入理解Spring事务(初步)

深入理解Spring事务(初步)

一.什么是事务,为什么要有事务?

保证数据的一致性。

事物的特性

原子性:不可分割。要么执行要么不执行,不能拆分类似于多线程同步。

一致性:数据一致。例:A有100,借给B20。总和80+20=100。

隔离性:互不影响我。

持久性:永久保存数据。

二.项目中是怎样用事务的?

分类:

1.编程事务:手动开启关闭事务;

2.声明式事务:自动开启关闭事务。xml方式和注解方式。

编程事务代码如下:

xml配置:

@Component
public class TransactionManager {
    @Autowired
    private DataSourceTransactionManager dataSourceTransactionManager;


    public TransactionStatus begin() {
        // 获取到事物状态
        return dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());
    }

     // 提交事务
    public void commit(TransactionStatus transactionStatus) {
        dataSourceTransactionManager.commit(transactionStatus); // 数据会提交到数据库中...

    }

     // 回滚事务
    public void rollback(TransactionStatus transactionStatus) {
        dataSourceTransactionManager.rollback(transactionStatus);
    }
}

service:

    public void add() {
      TransactionStatus transactionStatus=transactionManager.begin();
      try {
         System.out.println("业务逻辑层");
         userDao.add("狒狒1",21);
         // int i=1/0;
         userDao.add("莫吊",21);
         transactionManager.commit(transactionStatus);
      }catch (Exception e){
         e.printStackTrace();
         if (transactionStatus!=null) {
            transactionManager.rollback(transactionStatus);
         }
      }


   }
}

dao:

public void add(String name, int age) {
    /**
     * @description:使用工具类操作数据库
     * @param name,age
     * @return: void
     * @author: LiShun
     * @time: 2019/12/10 14:23
     */
    String sql = "INSERT INTO user(name,age) values(?,?);";
    int update = jdbcTemplate.update(sql, name, age);
    System.out.println("updateResult:" + update);
}

测试类:

如果不将int i=1/0注释,会回滚事务,数据不会添加至数据库。反之,添加成功。

注解方式实现:

修改xml:

修改service:

运行后会抛异常回滚事务,数据不会添加成功。需要将int i=1/0注释,才会添加数据成功。

三.传播七种行为。

Spring中事务的定义:

Propagationkey属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。)有以下选项可供使用:

  • PROPAGATION_REQUIRED--支持当前事务,如果当前方法没有事务,就新建一个事务。这是最常见的选择。
  • PROPAGATION_SUPPORTS--支持当前事务,如果当前方法没有事务,就以非事务方式执行。
  • PROPAGATION_MANDATORY--支持当前事务,如果当前方法没有事务,就抛出异常。 
  • PROPAGATION_REQUIRES_NEW--新建事务,如果当前方法存在事务,把当前事务挂起。 
  • PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前方法存在事务,就把当前事务挂起。 
  • PROPAGATION_NEVER--以非事务方式执行,如果当前方法存在事务,则抛出异常。

  面高级经常会问到

注:本博客纯个人学习笔记,如有错误希望指出,谢谢。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章