博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Spring框架]Spring 事务管理基础入门总结.
阅读量:5152 次
发布时间:2019-06-13

本文共 5442 字,大约阅读时间需要 18 分钟。

前言:

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

事务是逻辑上一组操作,这组操作要么全都成功,要么全都失败.

事务的属性: ACID

原子性(Atomicity): 事务作为一个整体被执行,包含在其中的对数据的操作要么全部被执行,要么都不执行.
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态. 一致状态的含义是数据库中的数据应满足为完整性约束.
隔离性(Isolation):多个事务并发执行时, 一个事务的执行不应该影响其他事务的执行.
持久性(Durability):一个事务一旦提交, 他对数据库的修改应该永久保存在数据库中.
  

二, Spring的事务管理

一类:编程式事务管理.手动编写代码管理事务.

二类:声明式事务管理.通过配置完成事务管理.(AOP) : 这里只说声明式的事务管理.

事务管理的API:

PlatformTransactionManager :平台事务管理器

  * 是真正管理事务的对象.

TransactionDefinition :事务定义信息.

  * 定义事务的(隔离级别,传播行为,超时信息,只读)

TransactionStatus :事务状态.

  * 管理事务的过程中,事务有一些状态的改变.状态信息被记录在该对象中.

Spring根据TransactionDefinition中定义的信息使用PlatformTransactionManager管理事务,管理事务过程中产生状态,将状态记录到TransactionStatus中.

 

三, Spring相关API详解

1,PlatformTransactionManager
2,
TransactionDefinition 

常量:

  * ISOLATION_*:定义事务的隔离级别.

  

  * PROPAGATION_*:定义事务的传播行为.

  
  
* 超时信息:
  
方法:

  

Transaction事务状态:

  |

Spring的事务传播行为:

PROPAGATION_REQUIRED :如果A,B操作,如果A有事务使用A的事务将B包含进来.如果A没有事务创建一个新事务将A,B包进来.PROPAGATION_SUPPORTS    :如果A,B操作,如果A有事务,使用A的事务将B包含进来.如果A没有事务,不使用事务.PROPAGATION_MANDATORY    :如果A,B操作,如果A有事务,使用A的事务将B包含进来.如果A没有事务,就会抛出异常.PROPAGATION_REQUIRES_NEW    :如果A,B操作,如果A有事务,将A的事务挂起.创建一个新事务执行B操作.PROPAGATION_NOT_SUPPORTED    :如果A,B操作,总是以非事务方式运行,如果A有,将A挂起.PROPAGATION_NEVER :如果A,B操作,总是以非事务方式运行,如果A有事务抛出异常.PROPAGATION_NESTED    :嵌套事务.如果A,B操作,A有事务,在A执行完之后设置一个保存点.如果B执行没有问题,一起提交.如果B出现问题.允许用户自己控制回滚到最初还是回滚到保存点.

 

四, Spring事务管理实例(声明式事务管理)

Spring声明式事务管理又可分为三种:

  1,基于TransactionProxyFactoryBean
   2, 基于AspectJ的XML方式的事务管理
  3, 基于AspectJ的注解方式事务管理
基于AspectJ的XML方式的事务管理:
  1,引入开发包:
  
  2,Service层代码:
AccountService.java

1 public interface AccountService {2 3     /**4      * 转账的方法5      */6     public void transfer(String from,String to,Double money);7 }

AccountServiceImpl.java:

1     private AccountDao accountDao; 2  3     public void setAccountDao(AccountDao accountDao) { 4         this.accountDao = accountDao; 5     } 6  7     @Override 8     /** 9      * 业务层转账的方法:10      *     from:转出账号11      *     to:转入账号12      *     money:转账金额13      */14     public void transfer(final String from, final String to, final Double money) {15         accountDao.outMoney(from, money);16         int d = 1 / 0;17         accountDao.inMoney(to, money);18     }19 20 }

  3,DAO层代码

AccountDAO.java:

1 public interface AccountDao {2     public void outMoney(String from, Double money);3 4     public void inMoney(String to, Double money);5 }

AccountDAOImpl.java:

1 public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao { 2  3     @Override 4     public void outMoney(String from, Double money) { 5         this.getJdbcTemplate().update("update account set money = money - ? where name = ?", money,from); 6     } 7  8     @Override 9     public void inMoney(String to, Double money) {10         this.getJdbcTemplate().update("update account set money = money + ? where name = ?", money,to);11     }12 13 }

  4,配置文件

jdbc.properties:

jdbc.driverClass=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql:///spring_transactionjdbc.user=rootjdbc.password=123

applicationcontext.xml:

1 
2
15 16
17 18
19
20
21
22
23
24
25
26
27
28
29 30
31
32
33
34 35
36
37
38
39 40
41
42
43
51
52
53
54 55 56
57
58
59
60
61

  5, 测试方法

SpringDemo.java:

1 @RunWith(SpringJUnit4ClassRunner.class) 2 @ContextConfiguration("classpath:applicationContext.xml") 3 public class SpringDemo3 { 4  5     @Resource(name="accountService") 6     private AccountService accountService; 7      8     @Test 9     public void demo1(){10         accountService.transfer("老马", "凤姐", 1000d);11     }12 }

关于XML的声明式事务管理就这些了, 那么下面来看下更简单的关于注解的声明式事务管理的做法.;
这里只需要看Service层是如何加注解以及applicationcontext中是怎样配置的就行了.

AccountServiceImpl.java:

1 /** 2  * @Transactional中属性 3  * propagation:传播行为. 4  * readOnly:是否只读 5  * timeout:超时信息 6  * isolation:隔离级别 7  */ 8 @Transactional(propagation=Propagation.REQUIRED,readOnly=false,timeout=-1,isolation=Isolation.DEFAULT) 9 public class AccountServiceImpl implements AccountService {10     private AccountDao accountDao;11 12     public void setAccountDao(AccountDao accountDao) {13         this.accountDao = accountDao;14     }15 16     @Override17     /**18      * 业务层转账的方法:19      *     from:转出账号20      *     to:转入账号21      *     money:转账金额22      */23     public void transfer(final String from, final String to, final Double money) {24         accountDao.outMoney(from, money);25         int d = 1 / 0;26         accountDao.inMoney(to, money);27     }28 }

applicationcontext.xml:

1 
2
15 16
17 18
19
20
21
22
23
24
25
26
27
28
29 30
31
32
33
34 35
36
37
38
39 40
41
42

 

注解方式的声明式事务管理也就是这么多, 看起来确实简单了很多.

 

转载于:https://www.cnblogs.com/wang-meng/p/5657267.html

你可能感兴趣的文章
android之Handler Runnable实现倒计时
查看>>
putty修改编码
查看>>
线索二叉树
查看>>
安全版字符串操作函数
查看>>
cocos-creator 脚本逻辑-2
查看>>
ajax跨域问题
查看>>
异步请求选择
查看>>
【数据结构】——排序二叉树
查看>>
hdu 2592(Counting Sheep )
查看>>
Linux 服务器 监控命令
查看>>
聊聊服务器的负载
查看>>
linux系统调用是通过软中断实现的吗
查看>>
Android 虚线分割Shape
查看>>
ListView的getFirstVisiblePosition等方法返回的是哪个对象
查看>>
2018-2019-2 20175320实验三《敏捷开发与XP实践》实验报告
查看>>
volatile关键字与synchronization关键字的区别?
查看>>
数据库msqlserver的几种类型及解决MSSQLServer服务启动不了的问题
查看>>
CSS轮廓 边距 填充 分组和嵌套
查看>>
xcode模拟器不显示键盘解决方案
查看>>
(转)一声叹息
查看>>