理解spring中的事务管理——代码实现


前言

简单了解什么是事务。 转账是生中常见的操作,比如从A账户转账100元到B账号。 站在用户角度而言,这是一个逻辑上的单一操作,然而在数据库系统中,至少会分成两个步骤来完成: 1、将A账户的金额减少100元 2、将B账户的金额增加100元。 但是如果在执行这两个操作时,如果发生意外情况。如断电A减少了钱但是B没有增加,这是银行最不愿意看到的(毕竟银行是弱势群体) 为解决这个问题在数据库提出了事务这个概念。 与程序的区别:一个程序中包含多个事务。在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

一、事务的条件

一般来说,事务是必须满足4个条件(ACID)::
原子性(Atomicity,或称不可分割性)、
一致性(Consistency)、
隔离性(Isolation,又称独立性)、
持久性(Durability)。

  1. 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  2. 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
  3. 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  4. 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

二、使用步骤

1.引入库

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
  <version>5.2.9.RELEASE</version>
</dependency>

2.配置xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <context:component-scan base-package="Dao org.example Bean Server"/>
    <!--    配置数据源-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--        MYSQL数据库驱动-->
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<!--        连接到数据库的URL-->
        <property name="url" value="jdbc:mysql://localhost:3306/spring?serverTimezone=UTC"/>
<!--        连接到数据的用户名-->
        <property name="username" value="1111"/>
<!--        连接数据库需要的密码-->
        <property name="password" value="111111"/>
    </bean>
<!--    配置JDBC模板-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
<!--    为数据源配置事务管理器-->
    <bean id="txManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
<!--    为事务管理器注册注解驱动器-->
    <tx:annotation-driven transaction-manager="txManager"/>
</beans>

3.Server

package Server.Impl;

import Dao.TestDao;
import Server.TestServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service("Server")
@Transactional
public class TestSeverImpl implements TestServer {
    @Autowired
    private TestDao testDao;

    @Override
    public void test() {
        //插入两条相同数据
        for (int i = 0; i < 2; i++) {
            testDao.adduser("111", "男", 12);
        }
    }
}

三、截图

不能执行,并且数据库中没有添加数据
结构目录

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值