白话Spring(基础篇)---编程式事务(1)

[一知半解,就是给自己挖坑]

本文,我们来介绍一下Spring中的事务管理,在基础片中,我们直接介绍基本概念及用法,更多内容将会在高级篇中叙述,敬请期待!

-------------------------------------------------------------------------------------------------------------------------------------

1.什么是事务?

这里的事务的概念,最好在计算机环境下来理解。在操作系统中,我们为了保证一段程序执行过程不被中断,而引入了互斥锁的概念。这里事务的概念可以看作是对于互斥锁的事件过程的另一种解释。即,一个事务执行的前后,数据资源的状态始终是正确的。由此,我们得到了事务的几个基本属性:原子性,一致性,隔离性,持久性。

1.1.原子性:

原子性要求事务所包含的全部操作是一个不可分割的整体,这些操作要么全部提交成功,要么只要其中一个操作失败,那么全部失败。

1.2.一致性:

一致性要求事务再执行之前数据资源是保持一致的,在执行之后数据资源仍然保持一致。举个例子来理解:A,B两个变量之和是10为大前提,那个对其中一个变量改变值之后的结果,必须也要满足这个大前提。生活中常见的例子是银行里的转账操作就是一致性的非常好的例子。

1.3.隔离性:

隔离性即规定了不同事务之间的相互影响程度,换句话说就是不同事务之间的执行时机。这里的隔离性就衍生出原子性,一致性的概念。当一个事务开始执行对数据资源的访问时,另一个事务合适能够访问数据资源就决定了隔离性的大小。这里分为4个级别,由宽松到严格的顺序为:“Read Uncommitted”,“Read Committed”,“Repeatable Read”和“Serializable”关于这4个的概念,请读者自行查阅相关资料学习。

1.4.持久性

持久性要求事务对于数据资源的操作不可逆转,即事务完成之后,程序执行流已经彻底的退出该事务,该事务对应的程序执行流不可回退。通俗点的讲,就是“不要赖账”

-------------------------------------------------------------------------------------------------------------------------------------

接下来,我们就来看看Spring中的事务管理的使用。

本文我们先来介绍Spring中的第一种方式:使用“编程式事务管理”的实现方法

 

准备工作:

 

a.操作系统:win7 x64

b.开发工具:eclipse mars j2ee版本,maven3.3.2,Spring 4,junit4.12,mybatis

c.建立Spring10,工程基本结构如下图:

-------------------------------------------------------------------------------------------------------------------------------------

1.创建BankDao.java。具体内容如下:

 

 
  1. package com.java.ingo.dao;

  2.  
  3. import com.java.ingo.entity.Account;

  4.  
  5. /**

  6. *@author 作者 E-mail:ingo

  7. *@version 创建时间:2016年3月6日上午9:21:05

  8. *类说明

  9. */

  10. public interface BankDao {

  11. public void update(Account account);

  12. }

2.创建Account.java文件,具体内容如下:

 

 

 
  1. package com.java.ingo.entity;

  2. /**

  3. *@author 作者 E-mail:ingo

  4. *@version 创建时间:2016年3月6日上午10:36:57

  5. *类说明

  6. */

  7. public class Account {

  8. private int id;

  9. private int money;

  10. public int getId() {

  11. return id;

  12. }

  13. public void setId(int id) {

  14. this.id = id;

  15. }

  16. public int getMoney() {

  17. return money;

  18. }

  19. public void setMoney(int money) {

  20. this.money = money;

  21. }

  22. public Account(int id, int money) {

  23. super();

  24. this.id = id;

  25. this.money = money;

  26. }

  27. public Account() {

  28. super();

  29. // TODO Auto-generated constructor stub

  30. }

  31.  
  32. }

3.创建IBankService.java文件,具体内容如下:

 

 

 
  1. package com.java.ingo.service;

  2.  
  3. /**

  4. *@author 作者 E-mail:ingo

  5. *@version 创建时间:2016年3月6日上午9:26:22

  6. *类说明

  7. */

  8. public interface IBankService {

  9. public void transferMoney(int sourceId,int desId,int money);

  10. }


4.创建BankServiceImpl.java文件,具体内容如下:

 

 

 
  1. package com.java.ingo.service.impl;

  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;

  4. import org.springframework.stereotype.Component;

  5. import org.springframework.stereotype.Service;

  6. import org.springframework.transaction.TransactionStatus;

  7. import org.springframework.transaction.support.TransactionCallbackWithoutResult;

  8. import org.springframework.transaction.support.TransactionTemplate;

  9.  
  10. import com.java.ingo.dao.BankDao;

  11. import com.java.ingo.entity.Account;

  12. import com.java.ingo.service.IBankService;

  13.  
  14. /**

  15. *@author 作者 E-mail:ingo

  16. *@version 创建时间:2016年3月6日上午9:26:22

  17. *类说明

  18. */

  19. @Service

  20. public class BankServiceImpl implements IBankService{

  21. @Autowired

  22. private BankDao bankDao;

  23.  
  24.  
  25. private TransactionTemplate transactionTemplate;

  26.  
  27. public void setBankDao(BankDao bankDao) {

  28. this.bankDao = bankDao;

  29. }

  30.  
  31.  
  32. public void setTransactionTemplate(TransactionTemplate transactionTemplate) {

  33. this.transactionTemplate = transactionTemplate;

  34. }

  35.  
  36.  
  37. public void transferMoney(final int countA,final int countB,final int money) {

  38. transactionTemplate.execute(new TransactionCallbackWithoutResult() {

  39. @Override

  40. protected void doInTransactionWithoutResult(TransactionStatus status) {

  41. Account accountA = new Account(countA,money);

  42. Account accountB = new Account(countB,money);

  43. bankDao.updateOut(accountA);

  44. //System.out.println(1/0);

  45. bankDao.updateIn(accountB);

  46. }

  47. });

  48. }

  49.  
  50. }

5.创建beans.xml文件,具体内容如下;

 

 

 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  4. xmlns:p="http://www.springframework.org/schema/p"

  5. xmlns:aop="http://www.springframework.org/schema/aop"

  6. xmlns:context="http://www.springframework.org/schema/context"

  7. xmlns:jee="http://www.springframework.org/schema/jee"

  8. xmlns:tx="http://www.springframework.org/schema/tx"

  9. xsi:schemaLocation="

  10. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd

  11. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

  12. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd

  13. http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd

  14. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

  15. <context:component-scan base-package="com.java" />

  16. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"

  17. destroy-method="close">

  18. <property name="driverClassName" value="com.mysql.jdbc.Driver" />

  19. <property name="url" value="jdbc:mysql://localhost:3306/db_bank" />

  20. <property name="username" value="root" />

  21. <property name="password" value="1234" />

  22. </bean>

  23. <!-- 配置mybatis的sqlSessionFactory -->

  24. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

  25. <property name="dataSource" ref="dataSource" />

  26. <!-- 自动扫描mappers.xml文件 -->

  27. <property name="mapperLocations" value="classpath:mappers/*.xml"></property>

  28. </bean>

  29. <!-- DAO接口所在包名,Spring会自动查找其下的类 -->

  30. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

  31. <property name="basePackage" value="com.java.ingo.dao" />

  32. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>

  33. </bean>

  34. <!-- jdbc事务管理器 -->

  35. <bean id="transactionManager"

  36. class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

  37. <property name="dataSource" ref="dataSource"></property>

  38. </bean>

  39.  
  40.  
  41. <bean id="transactionTemplate"

  42. class="org.springframework.transaction.support.TransactionTemplate">

  43. <constructor-arg

  44. type="org.springframework.transaction.PlatformTransactionManager"

  45. ref="transactionManager" />

  46. </bean>

  47.  
  48.  
  49. <bean id="namedParameterJdbcTemplate"

  50. class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">

  51. <constructor-arg ref="dataSource"></constructor-arg>

  52. </bean>

  53.  
  54.  
  55. <bean id="bankService" class="com.java.ingo.service.impl.BankServiceImpl">

  56. <property name="transactionTemplate" ref="transactionTemplate"></property>

  57. </bean>

  58.  
  59. </beans>


6.创建BankMapper.xml文件,具体内容如下:

 

 

 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <!DOCTYPE mapper

  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  5. <mapper namespace="com.java.ingo.dao.BankDao">

  6. <update id="updateIn" parameterType="com.java.ingo.entity.Account">  

  7.        UPDATE account SET money=money+#{money} WHERE id=#{id}

  8.     </update>

  9.     <update id="updateOut" parameterType="com.java.ingo.entity.Account">  

  10.        UPDATE account SET money=money-#{money} WHERE id=#{id}

  11.     </update> 

  12. </mapper>

7.创建T.java文件,具体内容如下:

 

 

 
  1. package Main;

  2.  
  3. import org.springframework.context.ApplicationContext;

  4. import org.springframework.context.support.ClassPathXmlApplicationContext;

  5.  
  6. import com.java.ingo.service.IBankService;

  7.  
  8.  
  9. /**

  10. * @author 作者 E-mail:ingo

  11. * @version 创建时间:2016年3月4日上午11:46:52 类说明

  12. */

  13. public class T {

  14.  
  15. public static void main(String[] args) {

  16. ApplicationContext context = new ClassPathXmlApplicationContext("classpath:beans.xml");

  17. IBankService bankService = (IBankService) context.getBean("bankService");

  18. bankService.transferMoney(1,2,200);

  19. }

  20. }

8.创建数据库db_bank,创建t_account表。

 



9.测试方法:运行main方法,然后刷新数据库,观察数据库变化。

 

10.打开System.out.println(1/0);注释,再次运行main方法,观察数据库变化。

-----------------------------------------------------------------------------------------------------------------------------------

至此,白话Spring(基础篇)---编程式事务(1)结束。

 

 

参考资料:

Spring官网:http://spring.io/docs

Mybatis官方文档:官方文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值