Spring 事务

1. 回忆之前事务知识点

 一:事务的概念

将一系列的数据操作捆绑在一起,成为一个整体进行统一管理!

一条或者多条sql语句的集合!

 二:事务的ACID特性

原子性(Atomicity):在事务中的操作,要么都执行,要么都不执行!

一致性(Consistency):事务必须保证数据从一个一致性的状态到达另一个一致性的状态!

持久性(Durability):事务一旦提交,对数据库的数据影响是永久性的!

隔离性(Isolation):每个事务之前互不干扰!

三: 事务创建的原则:

1.事务尽可能简短

因为启动事务之后,数据库管理系统需要保留大量资源来保证事务的ACID!

如果是多用户的系统,那么会严重影响我们的系统性能!

2.事务中访问的数据量要小

在并发的情况下,执行事务,事务的访问量越小,各个线程之前对数据的

争夺就越小!

3.查询时尽量不使用事务

因为查询不会修改数据!

4.在事务处理过程中,尽量不要出现用户等待的情况

如果登台事件过程,占用资源太久,有可能造成系统阻塞!

四: 必须掌握事务中的两个属性:

1.Isolation:五种事务隔离级别

01.default:采用数据库默认的事务隔离级别

mysql:repeatable-read(可重复读取)

oracle:read-committed(读提交)

02.repeatable-read(可重复读取):解决了脏读和不可重复读,但是有可能发生幻读(通过其他的锁机制解决)!

03.read-committed(读提交):解决了脏读,但是没解决不可重复读

04.read-uncommitted(读未提交):什么都没有解决!

05.serializable(串行化):解决并发的问题!

2.Propagation:七种事务传播行为

01.required:是spring默认的事务传播行为!

指定的方法必须在事务内执行,

如果没有事务,自动创建事务并执行!

02.supports:有没有事务都执行!

有事务就在事务中执行,否则直接执行!

03.mandatory:如果当前存在事务,就执行该事务,

如果当前不存在事务,就抛出异常。

04.requires_new:总是创建新事务,

如果当前方法存在事务,则当前事务挂起,

直到新创建的事务执行完毕!

05.not_supported:不能在事务中执行,

如果当前方法存在事务,则当前事务挂起!

06.never:     不能在事务中执行,

如果当前方法存在事务,则抛出异常。

07.nested:如果当前存在事务,则在嵌套事务内执行。

如果当前没有事务,则执行与requires_new类似的操作。

requires_new 启动一个新的, 不依赖于环境的 "内部" 事务.

这个事务将被完全 commited 或 rolled back 而不依赖于外部事务,

它拥有自己的隔离范围, 自己的锁, 等等. 当内部事务开始执行时,

外部事务将被挂起,内务事务结束时, 外部事务将继续执行.

另一方面, nested 开始一个 "嵌套的" 事务,

它是已经存在事务的一个真正的子事务. 潜套事务开始执行时,

它将取得一个 savepoint. 如果这个嵌套事务失败,

我们将回滚到此 savepoint. 潜套事务是外部事务的一部分,

只有外部事务结束后它才会被提交.

由此可见, requires_new 和 nested 的最大区别在于,

  requires_new 完全是一个新的事务,

  而 nested 则是外部事务的子事务,

  如果外部事务 commit, 潜套事务也会被 commit,

  这个规则同样适用于 roll back.

2. 创建需要的数据库语句

DROP TABLE IF EXISTS `account`;

CREATE TABLE `account` (

`aid` int(10) NOT NULL AUTO_INCREMENT,

`balance` double DEFAULT NULL,

`aname` varchar(20) DEFAULT NULL,

PRIMARY KEY (`aid`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

insert  into `account`(`aid`,`balance`,`aname`) values (1,10000,'张三');

DROP TABLE IF EXISTS `stock`;

CREATE TABLE `stock` (

`sid` int(10) NOT NULL AUTO_INCREMENT,

`sname` varchar(20) DEFAULT NULL,

`amount` int(10) DEFAULT NULL,

PRIMARY KEY (`sid`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

insert  into `stock`(`sid`,`sname`,`amount`) values (1,'张三',0);

3. 创建dao层和impl

4. 创建service层和impl

5. 创建需要的异常类 和 jdbc.properties文件

6. 使用AspectJ实现事务的管理xml配置文件

 <!--  01.引入  jdbc文件-->
<context:property-placeholder location="classpath:jdbc.properties"/> <!-- 02.配置数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.jdbcUrl}"/>
<property name="username" value="${jdbc.userName}"/>
<property name="password" value="${jdbc.password}"/>
</bean> <!--03.配置dao层-->
<bean id="accountDao" class="com.xdf.dao.impl.AccountDaoImpl">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="stockDao" class="com.xdf.dao.impl.StockDaoImpl">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--04.配置service层-->
<bean id="buyStockService" class="com.xdf.service.BuyStockServiceImpl">
<property name="accountDao" ref="accountDao"/>
<property name="stockDao" ref="stockDao"/>
</bean> <!--05.无论使用什么方式 都必须创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean> <!--06. 使用AspectJ 实现spring对事务的管理-->
<tx:advice id="myAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="buyStock" isolation="DEFAULT" propagation="REQUIRED" rollback-for="com.xdf.service.BuyStockException"/>
</tx:attributes>
</tx:advice> <!-- 07.配置切入点-->
<aop:config>
<aop:pointcut id="myPoint" expression="execution(* *..service.*.*(..))"/>
<aop:advisor advice-ref="myAdvice" pointcut-ref="myPoint"/>
</aop:config>

  测试方法代码

7. 使用事务工厂实现事务的管理xml配置文件

<!--06.使用事务工厂-->
<bean id="proxyFactoryBean" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!--配置事务管理器-->
<property name="transactionManager" ref="transactionManager"/>
<!--配置目标对象-->
<property name="target" ref="buyStockService"/>
<!--配置切点-->
<property name="transactionAttributes">
<props>
<!--指定切入点
01.事务隔离级别
02.事务传播行为
03.发生什么异常时?是回滚还是提交 - 回滚 +提交
-->
<prop key="buyStock">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-BuyStockException</prop>
</props>
</property>

  测试方法代码

8. 使用注解实现事务的管理xml配置文件

  测试代码和AspectJ一样

Spring(十三)-- Spring 事务的更多相关文章

  1. spring声明式事务管理总结

    事务配置 首先在/WEB-INF/applicationContext.xml添加以下内容: <!-- 配置事务管理器 --> <bean id="transactionM ...

  2. spring 声明式事务管理

    简单理解事务: 比如你去ATM机取5000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉5000元钱:然后ATM出5000元钱.这两个步骤必须是要么都执行要么都不执行.如果银行卡扣除了5000块但 ...

  3. Spring声明式事务管理基于@Transactional注解

    概述:我们已知道Spring声明式事务管理有两种常用的方式,一种是基于tx/aop命名空间的xml配置文件,另一种则是基于@Transactional 注解.         第一种方式我已在上文为大 ...

  4. Spring声明式事务管理基于tx/aop命名空间

    目的:通过Spring AOP 实现Spring声明式事务管理; Spring支持编程式事务管理和声明式事务管理两种方式. 而声明式事务管理也有两种常用的方式,一种是基于tx/aop命名空间的xml配 ...

  5. [Spring框架]Spring 事务管理基础入门总结.

    前言:在之前的博客中已经说过了数据库的事务, 不过那里面更多的是说明事务的一些锁机制, 今天来说一下Spring管理事务的一些基础知识. 之前的文章: [数据库事务与锁]详解一: 彻底理解数据库事务一 ...

  6. Spring MVC+Spring +Hibernate配置事务,但是事务不起作用

    最近做项目,被一个问题烦恼了很久.使用Spring MVC+Spring +Hibernate开发项目,在使用注解配置事务管理,刚开始发现无论如何数据库都无法更新,但是可以从数据库查询到数据.怀疑是配 ...

  7. Spring学习8-Spring事务管理(编程式事务管理)

    一.Spring事务的相关知识   1.事务是指一系列独立的操作,但在概念上具有原子性. 比如转账:A账号-100, B账号+100,完成.这两个操作独立是没问题的. 但在逻辑上,要么全部完成,要么一 ...

  8. Spring声明式事务配置管理方法

    环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加方法: 点击项目右键->Build Path->Add ...

  9. 161117、使用spring声明式事务抛出 identifier of an instance of

    今天项目组有成员使用spring声明式事务出现下面异常,这里跟大家分享学习下. 异常信息: org.springframework.orm.hibernate3.HibernateSystemExce ...

  10. Spring声明式事务管理与配置详解

    转载:http://www.cnblogs.com/hellojava/archive/2012/11/21/2780694.html 1.Spring声明式事务配置的五种方式 前段时间对Spring ...

随机推荐

  1. 9.一次简单的Web作业

    Web作业 <!DOCTYPE html> <!-- 作业描述:由于引用了JQuery库,所以请在联网的时候打开该页面. 本次作业是在上次作业的基础上的进一步完善,上次作业页面预留的 ...

  2. .py文件打包成.exe文件

    # 使用pyinstaller模块 # pip install pyinstaller # 在命令行执行 pyinstaller -F xxx.py

  3. go之基本数据类型

    一.整形 Go语言里支持有符号和无符号两种整型.这里的符号就是正负号. 1.分类: 有符号的整型:int , int8 , int16 , int32 , int64 无符号的整型:uint,uint ...

  4. AcWing:172. 立体推箱子(bfs)

    立体推箱子是一个风靡世界的小游戏. 游戏地图是一个N行M列的矩阵,每个位置可能是硬地(用”.”表示).易碎地面(用”E”表示).禁地(用”#”表示).起点(用”X”表示)或终点(用”O”表示). 你的 ...

  5. 微信小程序获得unionid

    一.微信小程序中app.js中: wx.login({ success: res => { if(res.code){ var code = res.code; wx.getSetting({ ...

  6. springboot拦截异常信息发送邮件提醒

    -- private JavaMailSender sender; 可能会出现注入错误,请注意yam配置文件中格式是否一致:否则会找不到注入的bean 一 发送邮件 在Springboot中发送邮件非 ...

  7. Python tuple 元组

    Python 元组 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup1 ...

  8. CSS、Bulma介绍

    文章目录 一.序章 二.CSS 基础 1. CSS 介绍 2. CSS 语法 3. CSS常用元素 1.颜色 2.字体大小 3.宽高 4.盒模型(单独拿出来讲) 5.背景 4.1样式和内容分离 4.2 ...

  9. ul 加 li 实现 select 下拉选功能

    由于 select 没有选中事件(onchange 事件在内容改变时才会触发,选择同一个条目不会触发),只好用其他控件来实现. <!doctype html> <html lang= ...

  10. AMBARI部署HADOOP集群(4)

    通过 Ambari 部署 hadoop 集群 1. 打开 http://192.168.242.181:8080  登陆的用户名/密码是 : admin/admin 2. 点击 “LAUNCH INS ...