日期:2014-05-16  浏览次数:20499 次

jdbc+spring+mysql事务理解和分析

首先了解事务的特性
事务四大特性(简称ACID)?

1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。
2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。
3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

?

在Action层(servlet)
依赖注入signService,调用saveSignInfo方法。

public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
 try {
  signService.saveSignInfo(username, password,nickname,pic_url,remark);
 } catch (RuntimeException e) {
  e.printStackTrace();
 }
}

?

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

在Service层接口定义

public interface ISignService {

 void saveSignInfo(SignBean sign);
}

?//实现类,测试事务,方法命名:save开头

public class SignServiceImpl implements ISignService {
 //模拟数据库表中id为自增长的主键列,假设第一条添加成功,第二条添加失败,测试事务回滚。
 public int saveSignInfo(String username, String password, String nickname, String pic_url, String remark) {

  SignBean sign = new SignBean();
  sign.setId(25);
  sign.setUser_id(6);
  sign.setMood("juint测试啦ww");
  signDao.saveQq(sign);
  System.out.println("333333333333333");
  
  SignBean sign2 = new SignBean();
  sign2.setId(24);
  sign2.setUser_id(2);
  sign2.setMood("juint测试啦qq");
  signDao.saveQq(sign2);
  System.out.println("44444444444444");
 }
}

?在Dao层接口定义

public interface ISignDao {

 void saveQq(SignBean sign);
}

?实现类,继承JdbcDaoSupport 。

public class SignDaoJdbc extends JdbcDaoSupport implements ISignDao {
 
 public void saveQq(SignBean sign) {
  String sql = " insert into tbl_sign(id,user_id,mood,save_time) " +
    " values("+sign.getId()+","+sign.getUser_id()+",'"+sign.getMood()+"',now()) ";
  JdbcTemplate jt=this.getJdbcTemplate();   
  jt.execute(sql);
 }

}

?
applicationContext.xml配置文件
?

<bean id="dataSource"
  class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName">
   <value>org.gjt.mm.mysql.Driver</value>
  </property>
  <property name="url">
   <value>jdbc:mysql://localhost:3306/07zxx?useUnicode=true&characterEncoding=utf8</value>
  </property>
  <property name="username">
   <value>root</value>
  </property>
  <property name="password">
   <value></value>
  </property>
 </bean>

 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource" />
 </bean>
 
 <bean id="txProxyTemplate" abstract="true" autowire="byName"
  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="transactionManager" ref="transactionManager" />
  <property name="transactionAttributes">
   <props>
    <prop key="save*">PROPAGATION_REQUIRED</prop>
   </props>
  </property>
 </bean>


 <bean id="signDao" class="com.studio502.control.dao.jdbc.SignDaoJdbc">
  <property name="dataSource" ref="dataSource"/>
 </bean>
 
 <bean id="signService" parent="txProxyTemplate">
  <property name="target">
   <bean class="com.studio502.control.service.impl.SignServiceImpl">
    <property name="signDao" ref="signDao" />
   </bean>
  </property>
 </bean>

?说明:
1.由于id键重复导致一条添加成功,一条失败.报错信息如下
org.springframework.dao.DataIntegrityViolationException: StatementCallback; SQL [ insert into tbl_sign(id,user_id,mood,save_time)? values(24,2,'juint测试啦qq4444',now()) ]; Duplicate entry '24' for key 1; nested exception is java.sql.SQLException: Duplicate