博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring事务管理
阅读量:4982 次
发布时间:2019-06-12

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

配置环境,导入相应jar包:ioc/aop/jdbcTemplate/c3p0连接池的相应jar包

程序大致说明:创建数据库

表结构:

dao中两个方法,lessSalary(),moreSalary()用来模拟转账,

然后再service中调用dao中的两个方法完成转账操作

 

一.不使用事务:

1  1 package org.dao; 2  2  3  3 import org.springframework.jdbc.core.JdbcTemplate; 4  4  5  5  6  6 public class Dao { 7  7     private JdbcTemplate jdbcTemplate; 8  8      9  9     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {10 10         this.jdbcTemplate = jdbcTemplate;11 11     }12 12 13 13     //小王转账给小马  金额200014 14     public void lessSalary() {15 15         // TODO Auto-generated method stub16 16         String sql="update acountmoney set salary=salary+? where name=?";17 17         jdbcTemplate.update(sql,-2000,"小王");    18 18     }19 19 20 20     public void moreSalary() {21 21         // TODO Auto-generated method stub22 22         String sql="update acountmoney set salary=salary+? where name=?";23 23         jdbcTemplate.update(sql,2000,"小马");;24 24     }25 25 26 26 }

 

1 package org.service; 2  3 import org.dao.Dao; 4  5 public class Service { 6     private Dao dao; 7  8     public void setDao(Dao dao) { 9         this.dao = dao;10     }11     public void changeSalary(){12         System.out.println("开始转账。。。。。。。。");13         this.dao.lessSalary();14         this.dao.moreSalary();15         System.out.println("转账成功。。。。。。。。。。。");16     }17 }
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
1 package org.test; 2  3 import org.junit.Test; 4 import org.service.Service; 5 import org.springframework.context.ApplicationContext; 6 import org.springframework.context.support.ClassPathXmlApplicationContext; 7  8 public class TestSalary { 9     @Test10     public void testsalary(){11         ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");12         Service s=(Service)ac.getBean("service");13         s.changeSalary();14     }15 }

程序运行结果:小王向小马转账2000,数据库中的数据得到了更新

以上代码没有使用事务,但是如果在转账过程中,即

1     public void changeSalary(){2         System.out.println("开始转账。。。。。。。。");3         this.dao.lessSalary();

        A:此处发生错误

4         this.dao.moreSalary();5         System.out.println("转账成功。。。。。。。。。。。");6     }

函数中A处出现错误,就会造成数据的不一致性,即小王的salary减少,小马的salary没有得到增加

1     public void changeSalary(){2         System.out.println("开始转账。。。。。。。。");3         this.dao.lessSalary();4         int t=10/0;//模拟发生异常5         this.dao.moreSalary();6         System.out.println("转账成功。。。。。。。。。。。");7     }

二.使用Spring框架中的事务机制进行处理(其他地方代码不需要改变,只需要在配置文件中增加事务处理,这就是AOP的魅力)

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 44
45
46
47
48
49
50
51 52
53
54
55
56
57
58
59 60

这样即使在A处发生了异常,通过事务的回滚机制,数据仍然保持一致性

所以事务处理在数据库访问中的作用显而易见。

三.使用注解方式实现事务管理

只需在service类上面标识注解,配置文件中开启注解扫描:

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 44
45
46 47
48 49 50
 
1 package org.service; 2  3 import org.dao.Dao; 4 import org.springframework.transaction.annotation.Transactional; 5 @Transactional //对该注解标识的类中的所有方法都加上注解 6 public class Service { 7     private Dao dao; 8  9     public void setDao(Dao dao) {10         this.dao = dao;11     }12     public void changeSalary(){13         System.out.println("开始转账。。。。。。。。");14         this.dao.lessSalary();15         //int t=10/0;//模拟发生异常16         this.dao.moreSalary();17         System.out.println("转账成功。。。。。。。。。。。");18     }19 }

 

其他程序不变,同样实现了事务管理功能。

 

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

欢迎大家转载,但请注明原创链接:http://www.cnblogs.com/Joke-Jay/p/6505949.html

 

转载于:https://www.cnblogs.com/Joke-Jay/p/6505949.html

你可能感兴趣的文章
程序员的情书
查看>>
Spring Cloud Eureka 使用 IP 地址进行服务注册
查看>>
Python 包的制作(__init__.py)
查看>>
java内存模型优化建议
查看>>
三十、模块补充
查看>>
流程审批设计
查看>>
别装了,你根本就不想变成更好的人
查看>>
数据库 join
查看>>
AES加密工具类[亲测可用]
查看>>
方法区
查看>>
Django-----ORM
查看>>
ARCGIS部分刷新
查看>>
发 零 食
查看>>
poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)
查看>>
洛谷P1886 滑动窗口
查看>>
Shell编程(二)Bash中调用Python
查看>>
主动与被动监控 拓扑图组合图 自定义监控
查看>>
SQL总结(一)基本查询
查看>>
PDF分割--可脱离python环境执行,可传参数,可弹窗的PC端小工具
查看>>
cas-client-core单点登录排除不需要拦截的URL
查看>>