Spring Boot 事务管理

事务

      作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行,事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过一组相关操作的组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使用应用程序更加可靠,一个逻辑工作要成为事务,必须要满足ACID(原子性,一致性,隔离性和持久性)属性,事务是数据库中运行的逻辑工作单元,由DBMS中的事务管理子系统负责事务处理

事务的属性

原子性(Atomic)

事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行,通常与某个事务关联的操作具有共同的目标性,并且是相互依赖的,如果系统只执行这些操作的子集.则可能破坏事务的整体目标,原子性消除了系统的处理操作子集的可能性

一致性(Consistent)

事务在完成时,必须使所有的数据都保持一致状态,在相关数据库中,所有规则都必须用于事务的修改.以保持所有数据的完整性,事务结束时,所有的内部数据结构(B树索引或双向链表)都必须是正确的.某些维护一致性的责任应由程序的开发人员承担,他们必须确保应用程序已强制所有已知的完整性约束.例如:当开发用于转账的程序时.应该避免任意移动小数点

隔离性(Insulation)

由并发事务所作的修改必须与任何其他并发事务所做的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一个事务的修改它之后的状态,事务不会查看中间状态的数据.这称为隔离性,因为它能够重新装载起始数据,并重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。当事务可序列化时获取最高的隔离级别,在此级别之上.从一组可并行执行的事务获得的结果与通过连续运行的每个事务获取的结果相同,由于高度隔离会限制可并行执行的事务数.所以一些程序降低隔离级别可以换取更大的吞吐量.

持久性(Duration)

事务完成之后,它对系统的影响是永久的,改修改即使出现致命的系统分故障也将一直保持

在SpringBoot 中用@Transactional来创建事务 ⚠️使用innodb创建的表

database-platform: org.hibernate.dialect.MySQL5InnoDBDialect

package com.asange.demo.service;

import com.asange.demo.model.User;
import com.asange.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Autowired
    UserRepository userRepository;

    /**
     * 使用事务执行两个数据插入(两个数据作为一个单元)
     */
    @Transactional
    public void save2user() {
        User user = new User();
        user.setName("张三34");
        user.setAge(34);
        userRepository.save(user);

        User user2 = new User();
        user2.setName("李四xxx8734787fudfdgghdfggfdgydey8owrfogywrgyugoyuweyyugywugy");
        user2.setAge(23);
        userRepository.save(user2);
    }
}
package com.asange.demo.controller;

import com.asange.demo.model.User;
import com.asange.demo.repository.UserRepository;
import com.asange.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class UserController {

 
    @Autowired
    UserService userService;

    @PostMapping("user/add2")
    public void save2user() {
        userService.save2user();
    }

}

启动程序,我们把表的name字段 长度改成4个


这样插入就不能成功,再加两次插入用同一个事务,这样数据库两条都不会存在


看数据库:




猜你喜欢

转载自blog.csdn.net/axuanqq/article/details/79828297