Spring针对事务的操作

事务的概念:事务是数据库最基本的单元,逻辑上的一组操作,要么都成功,如果有一个操作失败则都失败。

事务的特性:ACID

原子性、一致性、隔离性、持久性

JavaEE环境三层结构

1.WEB视图层

2.Service业务逻辑层

主要包含一些业务逻辑

3.数据访问层

包含对数据库操作的方法,不涉及业务的操作

(1)事务添加到JavaEE三层结构的Service业务逻辑层

(2)在Spring进行事务管理操作,有两种方式:

①编程式事务管理:set autocommit = false

哪些操作会导致数据库的自动提交?

1.DDL操作一旦执行,都会自动提交,set autocommit = false对DDL操作无效。

2.DML默认情况会自动提交,可以通过set autocommit = false的方式取消DML操作的自动提交。

DML(Data Manipulation Language)数据操纵语言:

适用范围:对数据库中的数据进行一些简单操作,如insert,delete,update,select等.

DDL(Data Definition Language)数据定义语言:

适用范围:对数据库中的某些对象(例如,database,table)进行管理,如Create,Alter和Drop.

    @Test
public void updateTest() { Connection conn = null;
try {
conn = JDBCUtils.getConnection();
conn.setAutoCommit(false); // System.out.println(conn.getAutoCommit()); String sql1 = "update user set balance = balance - 100 where uer=?";
update(conn, sql1, "AA"); System.out.println(1/0); String sql2 = "update user set balance = balance + 100 where uer=?";
update(conn, sql2, "2B"); System.out.println("转账成功");
conn.commit(); } catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
try {
if(conn!=null) {
conn.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} }

声明式事务管理

基于注解方式(使用)

1.创建事务管理器 DataSourceTractionManager,并注入数据源(数据库连接池)

<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>

2.在配置文件中引入名称空间tx

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/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"

3.开启事务注解

<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

4.在Service中添加事务注解@Tranctional

在类上面添加此注解,则类中所有方法都添加到事务,若添加到方法上,则此方法添加到事务。

    @Transactional
public void accountMoney(String id1, String id2, double money) {
accountDao.reduceMoney(id1, money); System.out.println(1/0); accountDao.addMoney(id2, money);
}

钱数不会发生变化

注解@Transactional的相关参数

1.propagation 事务传播行为

事务的传播行为,指的是多事务之间进行调用时,这个过程中的是如何管理的。

![](file://D:\资料\学习笔记\Java\Spring\2.png?msec=1649505122694)

事务的传播行为由传播属性指定。Spring定义了7种传播行为,重点记住前两个。

传播属性 描述
REQURED 如果调用方法有事务在运行,当前方法就在这个事务中运行,否则,就启动一个自己的新的事务,并在此事务中运行。(如上图)
REQURED_NEW 当前方法必须启动自己的事务,并在自己的事务中进行,如果调用方法中有事务在运行,则应该将其挂起
SUPPORTS
NOT_SUPPORTED
MANDATORY
NEVER
NESTED
@Transactional(propagation = Propagation.REQUIRED)

2.isolation 事务隔离级别

事务的隔离性,是指多事务之间操作不会受彼此影响,不考虑隔离性会产生很多问题:

①脏读:一个事务读取到了另一个未提交事务的数据(即两个事务都没有提交,事务可能回滚导致另一个事务读到脏数据)

②不可重复读:一个未提交事务读取到另一提交事务修改数据

![](file://D:\资料\学习笔记\Java\Spring\3.png?msec=1649505122695)

未提交事务的事务两次读到的数据不一致,正常情况下是不能读取数据的

脏读是一个问题,但是不可重复读是一种现象,是允许发生的

③幻读:一个未提交事务读到另一个提交事务添加的数据,两次读到的行数不一致

通过设置事务隔离级别,解决读问题

脏读 不可重复读 幻读
Read Uncommitted
(读未提交)
Read Committed
(读已提交)
Repeatable Read
(可重复读)
Serializable
(可串行化)
@Transactional(isolation = Isolation.SERIALIZABLE)

MySQL默认级别为REPEATABLE READ可重复读

3.timeout 超时时间

事务需要在一定时间内进行提交,超过这个时间就会回滚

默认值为-1,表示不超时,值以s为单位

4.readOnly 是否只读

读:查询操作

写:添加修改删除操作

5.rollbackFor 事务回滚

设置出现哪些异常进行事务的回滚

6.noRollbackFor 事务不回滚

设置出现哪些异常不进行事务的回滚

只需设置为异常的Class即可

基于XML配置文件方式

(4)在Spring进行声明式事务管理,底层使用AOP原理

(5)Spring事务管理API

完全注解开发
@Configuration //配置类
@ComponentScan(basePackages = "com.hikaru") //扫描组件
@EnableTransactionManagement //开启事务
public class TxConfig {
@Bean
public DruidDataSource getDataSource() throws IOException {
DruidDataSource druidDataSource = new DruidDataSource(); InputStream is = TxConfig.class.getClassLoader().getResourceAsStream("JDBC.properties");
Properties properties = new Properties();
properties.load(is); String driverClassName = properties.getProperty("driverClassName");
String url = properties.getProperty("url");
String username = properties.getProperty("username");
String password = properties.getProperty("password"); druidDataSource.setDriverClassName(driverClassName);
druidDataSource.setUrl(url);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password); return druidDataSource;
} @Bean
public DataSourceTransactionManager getTransactionManager(DruidDataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager() ;
transactionManager.setDataSource(dataSource);
return transactionManager;
} @Bean
public JdbcTemplate getJdbcTemplate(DruidDataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource); return jdbcTemplate;
} @Test
public void test() throws IOException, SQLException {
DruidDataSource druidDataSource = getDataSource();
System.out.println(druidDataSource.getConnection());
}
}

其中@Bean作用是将方法返回值注入IOC容器

配置类方法中的形参均在IOC容器中找到

测试

    @Test
public void test() {
ApplicationContext context =
new AnnotationConfigApplicationContext(TxConfig.class);
AccountService accountService = context.getBean("accountService", AccountService.class);
accountService.accountMoney("1001", "1002", 500);
}

【Spring5】数据库事务操作的更多相关文章

  1. Django的ORM实现数据库事务操作

    在Django中实现数据库的事务操作 在学习MySQL数据库时,MySQL数据库是支持原子操作的. 什么是数据库的原子操作呢??打个比方,一个消费者在一个商户里刷信用卡消费. 交易正常时,银行在消费者 ...

  2. Spring事务传播及数据库事务操作

    从Spring 事务配置说起 先看看Spring 事务的基础配置 <aop:aspectj-autoproxy proxy-target-class="true"/> ...

  3. TP5数据库事务操作

    使用事务处理的话,需要数据库引擎支持事务处理.比如 MySQL 的 MyISAM 不支持事务处理,需要使用 InnoDB 引擎. 使用 transaction 方法操作数据库事务,当发生异常会自动回滚 ...

  4. Database学习 - mysql 数据库 事务操作

    事务 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 数据库开启事务命令: start transaction   开启事务 rollback  回滚事务,即撤销指定的 ...

  5. 数据库事务中的隔离级别和锁+spring Transactional注解

    数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题.ACID首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(At ...

  6. TP5 模型事务操作

    注意:数据只要涉及多表一致性操作,必须要开启数据库事务操作 ThinkPHP5 中模型层中使用事务: try{ $this->startTrans(); $this->data($orde ...

  7. [转]数据库事务中的隔离级别和锁+spring Transactional注解

    数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题.ACID首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(At ...

  8. MySQL事务操作

    在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作.因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION ...

  9. (四)SQL入门 数据库的操作与事务管理

    数据库的操作,有三个最基本的语句,insert插入,update修改,delete删除. 不同的数据库厂商的实现可能不同,所以就不说具体的语法怎么写的了.说语法也没有意义,到处都可以复制粘贴,记得听某 ...

  10. andorid SQLite数据库的增删改查 和事务操作

    .xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...

随机推荐

  1. git push错误failed to push some refs to的解决

    问题说明 当我们在github版本库中发现一个问题后,你在github上对它进行了在线的修改:或者你直接在github上的某个库中添加readme文件或者其他什么文件,但是没有对本地库进行同步.这个时 ...

  2. swftools工具将pdf文件转换为swf文件 文字丢失

    开发客户网站时遇到了一个需求,客户要求后台上传pdf文件,前台能以翻书的形式直接访问. 首先想到的是使用js解决,用户访问前端页面时,php将文件路径发送给js,让js呈现出来翻书的效果.在网上百度了 ...

  3. 解决git仓库项目 添加到github非空仓库冲突问题 error: failed to push some refs to 'https://github.com/Qtoken/......'

    error: failed to push some refs to 'https://github.com/Qtoken/......' 1. 问题描述:执行命令:git push origin m ...

  4. Spring校验:@Validated和@Valid区别

    结论: Spring validation验证框架对入参实体进行嵌套验证必须在相应属性(字段)加上@Valid而不是@Validated Spring Validation验证框架对参数的验证机制提供 ...

  5. consul 服务注册与更新

    服务注册与发现是微服务架构中不可或缺的重要组件. 起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问.直到后来出现了多个节点的分布式架构,起初的解决手段是在服 ...

  6. 怎样清空 DNS 缓存?

    在 Windows 下命令行执行:ipconfig /flushdns 在 macOS 下执行命令:sudo killall -HUP mDNSResponder

  7. 解决com.alibaba.excel.exception.ExcelGenerateException: Can not close IO.

    我在使用easycel导出到zip包中时,出现了这个问题.各种文件输出时产生的问题其实大同小异 查看了一些网上的文章,还有github上关于此bug的issue,总算是理清并解决了. 解决方法一 主要 ...

  8. button 样式 触发器

    <Style x:Key="Style.OkOperationButton" TargetType="ButtonBase"> <Setter ...

  9. springboot的websocket因IP问题无法连接

    首先遇到这个问题有点奇葩,出现在项目上线时的客户现场,头两天一直都无法确定原因,因为它的表现方式很奇怪,基于springboot实现的websocket,同样的代码在公司研发环境不会有问题,客户现场会 ...

  10. [BUUCTF]极客大挑战 2019EasySQL1 write up

    顾名思义,简单的SQL注入! 先浅了解一下注入:SQL 注入(SQL Injection) 是发生在 Web 程序中数据库层的安全漏洞,是网站存在最多也是最简单的漏洞. 主要原因是程序对用户输入数据的 ...