编程式事务管理
在配置文件中声明事务管理器和TransactionTemplate
<!-- 定义TransactionTemplate模板 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="propagationBehaviorName">
<value>PROPAGATION_REQUIRED</value>
</property>
</bean>
<!-- 定义事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<!-- 为TransactionExample注入数据源 、事务管理器、TransactionTemplate模板 -->
<bean id="transactionExample" class="com.mr.transaction.TransactionExample">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionTemplate">
<ref bean="transactionTemplate"/>
</property>
</bean>
</beans>
创建类 TransactionExample,定义添加数据的方法,执行两次添加数据库操作并用事务保护操作.以匿名类的方式定义TransactionCallback接口的实现来处理事务管理。
package com.mr.transaction;
import java.sql.Connection;
import java.sql.Statement;
import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
public class TransactionExample {
DataSource dataSource;//注入数据源
PlatformTransactionManager transactionManager;//注入事务管理器
TransactionTemplate transactionTemplate;//注入TransactionTemplate模板
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public PlatformTransactionManager getTransactionManager() {
return transactionManager;
}
public void setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public TransactionTemplate getTransactionTemplate() {
return transactionTemplate;
}
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
this.transactionTemplate = transactionTemplate;
}
public void transactionOperation() {
transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
Connection conn = DataSourceUtils.getConnection(dataSource);//获得数据库连接
try {
Statement stmt = conn.createStatement();
//执行两次添加方法
stmt.execute("insert into tb_user(name,age,sex) values('Psychee','20','女')");
int a=0;//制造异常测试事务是否配置成功
a=9/a;
stmt.execute("insert into tb_user(name,age,sex) values('Joseph','25','男')");
System.out.println("操作执行成功!");
} catch (Exception e) {
transactionManager.rollback(status);//事务回滚
System.out.println("操作执行失败,事务回滚!");
System.out.println("原因:"+e.getMessage());
}
return null;
}
});
}
}
创建类manager
package com.mr.main;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mr.transaction.TransactionExample;
public class Manager {
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml"); //装载配置文件
TransactionExample transactionExample = (TransactionExample) factory.getBean("transactionExample");//获取UserDAO
transactionExample.transactionOperation();//执行添加方法
}
}
编程式事务管理是指在程序代码中显式地定义事务的边界和操作,以确保数据在数据库中的一系列操作都成功或都失败。这种方法可以保持数据的一致性、完整性和可靠性。
通俗来说,编程式事务管理就像你在银行取钱时需要输入密码,然后进行多个操作(比如转账、查询余额等),如果其中有任何一个操作失败,整个操作就会回滚到最初状态,不会对你的账户造成影响;只有当所有操作都成功完成,才会提交并更新你的账户信息,这样可以保证你的账户数据的正确性。在程序设计中使用编程式事务管理,同样可以确保一系列操作的正确性和完整性。
声明式事务管理
修改配置文件,定义数据源datasource和事务管理器
<!-- 定义事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<!-- 定义TransactionProxy -->
<bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="target">
<bean id="addDAO" class="com.mr.dao.AddDAO">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
</property>
<property name="proxyTargetClass" value="true"/>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>
编写adddao类操作数据库。在adduser()方法中执行数据插入操作。在配置时定义为事务性方法并指明了事务属性。
package com.mr.dao;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import com.mr.user.User;
public class AddDAO extends JdbcDaoSupport {
//添加用户的方法
public void addUser(User user){
//执行添加方法的sql语句
String sql="insert into tb_user (name,age,sex) values('" +
user.getName() + "','" + user.getAge()+ "','" + user.getSex()+ "')";
//执行两次添加方法
getJdbcTemplate().execute(sql);
int a=0;//制造异常测试事务是否配置成功
a=9/a;
getJdbcTemplate().execute(sql);
}
}
创建manager类
package com.mr.main;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mr.dao.AddDAO;
import com.mr.user.User;
public class Manager {
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml"); //装载配置文件
AddDAO addDAO = (AddDAO)factory.getBean("transactionProxy");//获取AddDAO
User user = new User();//实例化User实体对象
user.setName("Joseph");//设置姓名
user.setAge(25);//设置年龄
user.setSex("男");//设置性别
addDAO.addUser(user);//执行数据库添加方法
}
}
声明式事务管理是一种基于注解或配置的方式来实现事务管理,而不需要在代码中显式地定义事务边界和操作。这种方法通过对代码进行标记或配置来指示何时开启和提交事务,以及何时回滚事务。
通俗来说,声明式事务管理就像你在银行取钱时,只需要填写一张转账单,并在上面写明所需转账金额、账户号码等信息,然后将单据交给银行职员即可,无需关心银行内部是如何处理这些操作的。在程序设计中使用声明式事务管理,同样可以简化代码的编写和维护,同时也提高了代码的可读性和可重用性。