Spring-事务管理

1、事务管理

1.1、回滚方式

默认回滚方式:发生运行异常时异常和error时回滚,发生受查(编译)异常时提交。不过,对于受查异常,程序员也可以手工设置其回滚方式

1.2、事务定义接口

1.2.1、事务隔离级别常量

这些常量是以ISOLATION_开头。即形如ISOLATON_XXX.

  • DEFAULT:采用 DB 默认的事务隔离级别。MySql 的默认为 REPEATABLE_READ; Oracle默认为 READ_COMMITTED。
  • READ_UNCOMMITTED:读未提交。未解决任何并发问题。
  • READ_COMMITTED:读已提交。解决脏读,存在不可重复读与幻读。
  • REPEATABLE_READ:可重复读。解决脏读、不可重复读,存在幻读
  • SERIALIZABLE:串行化。不存在并发问题。

1.2.2、事务传播行为常量

  • Propagation.REQUIRED:当前没有事务的时候,就会创建一个新的事务;如果当前有事务,就直接加入该事务,比较常用的设置
  • Propagation.SUPPORTS:支持当前事务,如果当前有事务,就直接加入该事务;当前没有事务的时候,就以非事务方式执行
  • Propagation.MANDATORY:支持当前事务,如果当前有事务,就直接加入该事务;当前没有事务的时候,就抛出异常
  • Propagation.REQUIRES_NEW:创建新事务,无论当前是否有事务都会创建新的
  • PROPAGATION_NESTED
  • PROPAGATION_NEVER
  • PROPAGATION_NOT_SUPPORTED

1.2.3、默认事务超时时限

常量 TIMEOUT_DEFAULT 定义了事务底层默认的超时时限,sql 语句的执行时长。

注意,事务的超时时限起作用的条件比较多,且超时的时间计算点较复杂。所以,该值一般就使用默认值即可。

2、基于注解的事务

java 复制代码
@Service
public class TeamService {
    @Autowired
    private TeamDao teamDao;

    /**
     * @Transactional  属性 说明:
     * readOnly:是否只读
     * rollbackFor={Exception.class}: 遇到什么异常会回滚
     * propagation事务的传播:
     *      Propagation.REQUIRED:当前没有事务的时候,就会创建一个新的事务;如果当前有事务,就直接加入该事务,比较常用的设置
     *      Propagation.SUPPORTS:支持当前事务,如果当前有事务,就直接加入该事务;当前没有事务的时候,就以非事务方式执行
     *      Propagation.MANDATORY:支持当前事务,如果当前有事务,就直接加入该事务;当前没有事务的时候,就抛出异常
     *      Propagation.REQUIRES_NEW:创建新事务,无论当前是否有事务都会创建新的
     * isolation=Isolation.DEFAULT:事务的隔离级别:默认是数据库的隔离级别ff
     */
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {Exception.class}, isolation = Isolation.DEFAULT)
    public int insert(Team team) {
        // 为了体现事务的内容:业务要求:同时插入两条数据都成功业务才算完成,一条失败整个业务失败
        int i1 = teamDao.insert(team);
        System.out.println("插入1:" + i1);
        int s = 1/0;
        int i2 = teamDao.insert(team);
        System.out.println("插入2:" + i2);
        return i1 + i2;
    }
}
XML 复制代码
    <context:component-scan base-package="com.AE.service"/>
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager"/>

测试

java 复制代码
public class test02 {
    @Test
    public void test01() {
        ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
        TeamService teamService = (TeamService) ac.getBean("teamService");
        Team team = new Team();
        team.settName("test1");
        team.setLocation("test1");
        int i = teamService.insert(team);
        System.out.println(i);
    }
}

3、基于XML的事务

添加依赖

XML 复制代码
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.6</version>
</dependency>

通过aop切面实现事务,在tx:advice中设置相关的设置

XML 复制代码
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="insert*" propagation="REQUIRED" isolation="DEFAULT"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="del*" propagation="REQUIRED"/>
            <tx:method name="query*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:pointcut id="pt" expression="execution(* com.AE.service..*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
    </aop:config>

Service中的把注解删掉之后其它代码就不变。

相关推荐
xmjd msup18 分钟前
mysql的分区表
数据库·mysql
Lyyaoo.18 分钟前
【JAVA Spring面经】Spring 事务失效情况
java·数据库·spring
MeAT ITEM23 分钟前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
dovens27 分钟前
PostgreSQL 中进行数据导入和导出
大数据·数据库·postgresql
IOT.FIVE.NO.127 分钟前
claude code desktop cowork报错解决和记录Workspace..The isolated Linux environment ...
linux·服务器·数据库
Rick199336 分钟前
mysql 慢查询怎么快速定位
android·数据库·mysql
952367 小时前
MyBatis
后端·spring·mybatis
科技小花8 小时前
全球化深水区,数据治理成为企业出海 “核心竞争力”
大数据·数据库·人工智能·数据治理·数据中台·全球化
X56619 小时前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务与子服务)
jvm·数据库·python
虹科网络安全10 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库