java中的事务和数据库中的事务功能相同,都是多条sql语句形成整体,要么一致成功要么一致失败。
例如:银行余额增删要么同时成功要么同时失败
commit 提交事物 --成功
rollback回滚事物 --失败
java中事务分为两种,一种是编程式,一种是声明式,但常用声明式
1、导入依赖
事务
<dependency>
<groupId>org.springframeword</groupId>
<artifactId>srping-tx</artifactId>
<version>5.0.5RELEASE</version>
</dependency>
mysql
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
</dependency>
jdbc框架
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
连接池
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
2、连接池技术
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
导入property文件
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driverClassName}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${user_name}"></property>
<property name="password" value="${password}"></property>
<property name="maxActive" value="${maxActive}"></property>
</bean>
<bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
以下是编程式事务使用
加事务
@Repository
public class UserDao {
@Autowired
JdbcTemplate jdbcTemplate;
@Autowired
PlatformTransactionManager transactionManager;
public void sel(){
//开启事务
DefaultTransactionDefinition definition=new DefaultTransactionDefinition();
TransactionStatus status=transactionManager.getTransaction(definition);
try{
jdbcTemplate.update("update account set money=monet-500 where id=1");
jdbcTemplate.update("update account set money=monet+500 where id=2")
//提交事务
transactionManager.commit(status);
}catch(Exception e){
//回滚事务
transactionManager.rollback(status);
}
}
}
声明式
利用aop实现事务的控制
1、在xml文件中指定好谁是增强类
<tx:advice id="interceptor" transaction-manager="transactionManager"> <!--指定事务管理器 -->
<tx:attributes>
<tx:method name="*"> <!-- 增强方法是谁 -->
</tx:method>
</tx:attributes>
</tx:advice>
2、织入
<aop:config>
<aop:advisor advice-ref="interceptor" pointcut="execution(void com.NEPU.tx.User.sel())"></aop:advisor> <!--前置,后置,异常增强全加上了 -->
</aop:config>
3、运行
@Repository
public class UserDao {
@Autowired
JdbcTemplate jdbcTemplate;
public void sel(){
jdbcTemplate.update("update account set money=monet-500 where id=1");
jdbcTemplate.update("update account set money=monet+500 where id=2");
}
}
这样就能开启
底层aop会自动在方法中加入前置,后置,异常增强;