前言
简单了解什么是事务。 转账是生中常见的操作,比如从A账户转账100元到B账号。 站在用户角度而言,这是一个逻辑上的单一操作,然而在数据库系统中,至少会分成两个步骤来完成: 1、将A账户的金额减少100元 2、将B账户的金额增加100元。 但是如果在执行这两个操作时,如果发生意外情况。如断电A减少了钱但是B没有增加,这是银行最不愿意看到的(毕竟银行是弱势群体) 为解决这个问题在数据库提出了事务这个概念。 与程序的区别:一个程序中包含多个事务。在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。一、事务的条件
一般来说,事务是必须满足4个条件(ACID)::
原子性(Atomicity,或称不可分割性)、
一致性(Consistency)、
隔离性(Isolation,又称独立性)、
持久性(Durability)。
- 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
- 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
- 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
二、使用步骤
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);
}
}
}
三、截图