前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring中的事务

Spring中的事务

作者头像
Swingz
发布2020-12-18 11:18:59
4040
发布2020-12-18 11:18:59
举报
文章被收录于专栏:SwingzSwingz

Spring中的事务

配置事务

spring中的配置文件

代码语言:javascript
复制
<?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
        http://www.springframework.org/schema/context/spring-context.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx.xsd">
    
    
        <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>


    <!-- 开启事务注解驱动 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

注解开启事务

@Transactional

Spring中事务的传播特性(propagation 属性)

  • REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
  • MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
  • REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
  • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

例子:

代码语言:javascript
复制
@Transactional( rollbackFor = Exception.class,propagation = Propagation.NESTED)

事务的隔离级别

SQL 标准定义的四个隔离级别为: Read Uncommitted ( 未提交读 ) 、 Read Committed (提交读)、 Repeatable Read (可重复读)、 Serializable (可串行化) ,下面分别介绍。

1、未提交读

就是一个事务可以读取另一个未提交事务的数据。 (1)打开一个客户端A,并设置当前事务模式为read uncommitted(未提交读),查询表account的初始值: (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account: (3)这时,虽然客户端B的事务还没提交,但是客户端A就可以查询到B已经更新的数据。 (4)一旦客户端B的事务因为某种原因回滚,所有的操作都将会被撤销,那客户端A查询到的数据其实就是脏读数据

2、读提交

就是一个事务要等另一个事务提交后才能读取数据。 (1)打开一个客户端A,并设置当前事务模式为read committed(未提交读),查询表account的所有记录; (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account; (3)这时,客户端B的事务还没提交,客户端A不能查询到B已经更新的数据,解决了脏读问题; (4)客户端B的事务提交; (5)客户端A执行与上一步相同的查询,结果 与上一步不一致,即产生了不可重复读的问题

3、重复读

就是在开始读取数据(事务开启)时,不再允许修改操作。 (1)打开一个客户端A,并设置当前事务模式为repeatable read,查询表account的所有记录 (2)在客户端A的事务提交之前,打开另一个客户端B,更新表account并提交 (3)在客户端A查询表account的所有记录,与步骤(1)查询结果一致,没有出现不可重复读的问题。 (4)重复读可以解决不可重复读问题。写到这里,应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作 (5)重新打开客户端B,插入一条新数据后提交; (6)在客户端A查询表account的所有记录,没有 查出 新增数据,所以没有出现幻读

4、Serializable 序列化(串行化)

序列化是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

1、事务隔离级别为读提交时,写数据只会锁住相应的行;

2、事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读;

3、事务隔离级别为串行化时,读写数据都会锁住整张表;

4、隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-12-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring中的事务
    • 配置事务
      • 注解开启事务
        • Spring中事务的传播特性(propagation 属性)
          • 事务的隔离级别
            • 1、未提交读
            • 2、读提交
            • 3、重复读
            • 4、Serializable 序列化(串行化)
        相关产品与服务
        文件存储
        文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档