事务实现
启动类加入注解@EnableTransacctionManagement
@SpringBootApplication
@EnableTransactionManagement
public class Demo11Application {
public static void main(String[] args) {
SpringApplication.run(Demo11Application.class, args);
}
}
指定事务管理器
@Configuration
public class BeanConfiguration {
/*@Bean
public DaoService daoService(@Autowired DaoServiceImpl bean) {
return (DaoService) bean;
}*/
@Resource(name="txManager1")
private PlatformTransactionManager txManager1;
// 创建事务管理器1
@Bean(name = "txManager1")
public PlatformTransactionManager txManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
// 实现接口 TransactionManagementConfigurer 方法,其返回值代表在拥有多个事务管理器的情况下默认使用的事务管理器
public PlatformTransactionManager annotationDrivenTransactionManager() {
return txManager1;
}
@Bean
public DaoService daoService(@Autowired DaoServiceImpl bean) {
return (DaoService) bean;
}
@Bean
public ServiceInter serviceInter() {
ServiceInter bean=new ServiceInterImpl();
return bean;
}
}
自定义事务类
public class DefaultTransactionDefinition implements TransactionDefinition,Serializable{
/**
* TransactionDefinition 事务的一些基础信息,如超时时间、隔离级别、传播属性等
* Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。
* 实现了Serializable接口的类可以被ObjectOutputStream转换为字节流,
* 同时也可以通过ObjectInputStream再将其解析为对象
* 事务的定义包括: 事务的隔离级别,事务的传播属性,超时时间设置,是否只读
* 事务的隔离级别是数据库本身的事务功能,事务的传播属性则是spring为我们提供的功能
* 该接口的实现DefaultTransactionDefinition,默认的事务定义
*/
/*
* 1.事务的传播属性为PROPAGATION_REQUIRED,
* 即当前没有事务的时候,创建一个,如果有则使用当前事务
* 2.事务的隔离级别采用底层数据库默认的隔离级别
* 3.超时时间采用底层数据库默认的超时时间
* 4.是否只读为false
*
* 事务属性定义
* */
private static final long serialVersionUID = 1L;
private int propagationBehavior = PROPAGATION_REQUIRED;
private int isolationLevel = ISOLATION_DEFAULT;
private int timeout = TIMEOUT_DEFAULT;
private boolean readOnly = false;
public int getPropagationBehavior() {
return propagationBehavior;
}
public void setPropagationBehavior(int propagationBehavior) {
this.propagationBehavior = propagationBehavior;
}
public int getIsolationLevel() {
return isolationLevel;
}
public void setIsolationLevel(int isolationLevel) {
this.isolationLevel = isolationLevel;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public boolean isReadOnly() {
return readOnly;
}
public void setReadOnly(boolean readOnly) {
this.readOnly = readOnly;
}
}
声明式事务
readOnly设置事务是否只读,timeout设置超时
//方法上的事务只是将这个方法纳入事务
@Transactional(readOnly=false,timeout=10)
public User Login(User user) {
// TODO Auto-generated method stub
if(daoService.findname(user) != null) {
if(daoService.finduser(user)==null) {
return user;
}else {
userMapper.lockUser(daoService.finduser(user));
return daoService.finduser(user);
}
}
return user;
}
手动事务管理
public User userTransaction(User user) {
// 新建事务定义,手动开启事务,把事务定义信息创建提交返回
TransactionStatus status=transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
if(daoService.findname(user) != null) {
if(daoService.finduser(user)==null) {
System.out.println("密码错误");
return user;
}else {
//加锁
//userMapper.lockUser(daoService.finduser(user));
// 手动事务提交
transactionManager.commit(status);
return daoService.finduser(user);
}
}
System.out.println("用户名为空");
// 业务逻辑
return user;
} catch (Exception e){
// 事务回滚
transactionManager.rollback(status);
}
return user;
}
首先在bean工厂注入platfromtransactionmanager(transactionmanager接口实现)(事务管理者)
用于获取事务
DefaulttranscationDefinition事务自定义
也可以使用默认事务transactiondefinition
定义之后手动开启事务
platfromtransactionmanager用于gettransaction()
transactionstatus用于获取事务状态
放入commit提交状态事务
放入rollback回滚状态事务