事务:
使用完全注解开发:
User类:
public class User {
private Integer id;
private String name;
private Integer money;
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setMoney(Integer money) {
this.money = money;
}
}
UserDao类:
public interface UserDao {
public void lostMoney();
public void addMoney();
}
UserDaoImpl类:
@Repository
public class UserDaoImpl implements UserDao{
@Autowired
JdbcTemplate jdbcTemplate;
@Override
public void lostMoney() {
String sql="update account set money=money-? where name=?";
jdbcTemplate.update(sql,100,"lbl");
}
@Override
public void addMoney() {
String sql="update account set money=money+? where name=?";
jdbcTemplate.update(sql,100,"wudi");
}
}
UserService类:
@Transactional开启事务
//@Transactional(propagation = Propagation.REQUIRED)默认是propagation = Propagation.REQUIRED
@Transactional(readOnly = false,timeout = -1,propagation = Propagation.REQUIRED,isolation = Isolation.READ_COMMITTED)//在类上加这个注解表示这个类的全部方法都是事务
@Service// 默认是false 默认-1
public class UserService {
@Autowired
UserDao userDao;
public void account(){
try {
//开启事务
//进行业务操作
userDao.addMoney();
userDao.lostMoney();
//没有发生异常,提交事务
}catch (Exception e){
//出现异常,事务回滚
}
}
}
Config类:
代替了xml配置
@Configuration
@ComponentScan(basePackages = "com.lbl")
@EnableTransactionManagement//开启事务
public class TxConfig {
@Bean
public DruidDataSource getDruidDataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
druidDataSource.setUrl("jdbc:mysql://localhost:3306/userdb");
druidDataSource.setUsername("root");
druidDataSource.setPassword("root");
return druidDataSource;
}
//创建jdbctemplate对象
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource){
//到ioc中找到类型是DataSource的对象
JdbcTemplate jdbcTemplate = new JdbcTemplate();
//注入DataSource
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}//创建事务管理器
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}
最后测试类:
@Test
public void test2(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TxConfig.class);
UserService userService = context.getBean("userService", UserService.class);
userService.account();
}
使用xml和注解完成事务:
bean.xml:
设置注解扫描范围
<context:component-scan base-package="com.lbl"></context:component-scan>
<!--注解都要用一个@bean代替一个<bean>标签-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/userdb"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
与Config类起同样作用。