Spring的事务管理难点剖析(1):DAO和事务管理的牵绊(一)

2014-11-24 08:46:59 · 作者: · 浏览: 4

人很少使用Spring而不使用Spring事务管理器的应用,因此常常有人会问:是否用了Spring,就一定要用Spring事务管理器,否则就无法进行数据的持久化操作呢?事务管理器和DAO是什么关系呢? 也许是DAO和事务管理如影随行的缘故吧,这个看似简单的问题实实在在地存在着,从初学者心中涌出,萦绕在老手的脑际。答案当然是否定的!我们都知道:事务管理是保证数据操作的事务性(即原子性、一致性、隔离性、持久性,即所谓的ACID),脱离了事务性,DAO照样可以顺利地进行数据的操作。


JDBC访问数据库

下面,我们来看一段使用Spring JDBC进行数据访问的代码:

01 package com.baobaotao.withouttx.jdbc;

02

03 import org.springframework.beans.factory.annotation.Autowired;

04 import org.springframework.jdbc.core.JdbcTemplate;

05 import org.springframework.stereotype.Service;

06 import org.springframework.context.ApplicationContext;

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

08 import org.apache.commons.dbcp.BasicDataSource;

09

10 @Service("userService")

11 public class UserJdbcWithoutTransManagerService {

12 @Autowired

13 private JdbcTemplate jdbcTemplate;

14

15 public void addScore(String userName,int toAdd){

16 String sql = "UPDATE t_user u SET u.score = u.score + WHERE user_name = ";

17 jdbcTemplate.update(sql,toAdd,userName);

18 }

19

20 public static void main(String[] args) {

21 ApplicationContext ctx = new

22 ClassPathXmlApplicationContext("com/baobaotao/withouttx/jdbc/jdbcWithoutTx.xml");

23 UserJdbcWithoutTransManagerService service =

24 (UserJdbcWithoutTransManagerService)ctx.getBean("userService");

25 JdbcTemplate jdbcTemplate = (JdbcTemplate)ctx.getBean("jdbcTemplate");

26 BasicDataSource basicDataSource = (BasicDataSource)jdbcTemplate.getDataSource();

27

28 //①检查数据源autoCommit的设置

29 System.out.println("autoCommit:"+ basicDataSource.getDefaultAutoCommit());

30

31 //②插入一条记录,初始分数为10

32 jdbcTemplate.execute("INSERT INTO t_user(user_name,password,score,last_logon_time)

33 VALUES('tom','123456',10,"+System.currentTimeMillis()+")");

34

35 //③调用工作在无事务环境下的服务类方法,将分数添加20分

36 service.addScore("tom",20);

37

38 //④查看此时用户的分数

39 int score = jdbcTemplate.queryForInt(

40 "SELECT score FROM t_user WHERE user_name ='tom'");

41 System.out.println("score:"+score);

42 jdbcTemplate.execute("DELETE FROM t_user WHERE user_name='tom'");

43 }

44 }

45


其中,jdbcWithoutTx.xml的配置文件如下所示:


01 < xml version="1.0" encoding="UTF-8" >

02 http://www.springframework.org/schema/beans"

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

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

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

06 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

07 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

08

09

10

11

12 destroy-method="close"

13 p:driverClassName="${jdbc.driverClassName}"

14 p:url="${jdbc.url}"

15 p:username="${jdbc.username}"

16 p:password="${jdbc.password}"/>

17

18

19 p:dataSource-