一、手动的进行设置回滚代码
1.在配置文件中添加事务管理器
<!-- 为数据源添加事务管理器 -->
<
bean
id=
"txManager"
class=
"org.springframework.jdbc.datasource.DataSourceTransactionManager"
>
<
property
name=
"
dataSource"
ref=
"dataSrouce"
></
property
>
</
bean
>
2.在dao中进行回滚事务
// 进行回滚的测试
@Autowired
DataSourceTransactionManager
txManager;
public
void rollBack() {
DefaultTransactionDefinition
definition =
new DefaultTransactionDefinition();
// 开启事务
TransactionStatus
transaction =
txManager.getTransaction(
definition);
try {
// String sqlString="delete from student where
sid
= ?";
// Object
params
[]= {1};
// 如果没有数据,并不会发生异常
// jdbcTemplate.update(sqlString,
params
);
// 但是插入相同的数据就会发生回滚
insertData();
//提交事务
txManager.commit(
transaction);
}
catch (Exception
e) {
// 先进行事务的回滚
txManager.rollback(
transaction);
System.
out.println(
"进行回滚");
}
}
二、使用事务模板,进行回滚代码,有利于解耦
1、在beans中还要进行配置,事务模板
<
bean
id=
"transactionTemplate"
class=
"org.springframework.transaction.support.TransactionTemplate"
>
<
property
name=
"
transactionManager"
ref=
"txManager"
></
property
>
</
bean
>
2、重要的是使用transactionTemplate类的excute方法,自动实现回滚。
@Autowired
TransactionTemplate transactionManager;
public Object rollBack2() {
// 使用execute中的回调doInTransaction中进行代码操作,如果发生异常,那么就执行回滚
Object execute = transactionManager.execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus arg0) {
String messageString = "成功了";
try {
insertData();
} catch (Exception e) {
messageString = "进行回滚";
}
return messageString;
}
});
return execute;
}
三、使用注解
1、在beans中进行配置
<!-- 为事务管理器注册注解驱动器 -->
<
tx:annotation-driven
transaction-manager=
"txManager"
/>
2.代码中使用
/**
* 事务属性:
*
* propagation: 事务的传播行为. 即当前的事务方法被另外一个事务方法调用时,当前的事务方法如何使用事务.
* REQUIRED: propagation的默认值. 使用调用者的事务.
* REQUIRES_NEW: 不使用调用者的事务,自己重新开启新的事务来使用.
* isolation: 事务的隔离级别. 最常用的取值:READ_COMMITTED
* rollbackFor : Class
* noRollbackFor: Class
* rollbackForClassName: String
* noRollbackForClassName: String
*
* readOnly: 只读. true / false
* 指定事务是否为只读事务.
* 如果真的是只读的操作,则由必要将事务设置为只读事务,可以帮助数据库引擎进行优化.
* timeout: 超时设置. 指定强制回滚事务之前 事务可以占用的时间. 避免一个事务占用过长的时间.
*/
@Transactional(propagation = Propagation.
REQUIRES_NEW, isolation = Isolation.
READ_COMMITTED,
// noRollbackFor= {UserAccountException.class}
readOnly =
true, timeout = 3)
public
void rollBack3() {
try {
insertData();
}
catch (Exception
e) {
throw
new RuntimeException();
}
}