写点什么

Spring-- 声明式事务控制,mysql 索引教程

用户头像
极客good
关注
发布于: 刚刚
  • [Spring–声明式事务控制](


)


[](


)spring 中关于事务的 API




在 spring 中提供了一些关于事务控制的接口,主要包括一下三个:


  • PlatformTransactionManager: 事务管理器–提供事务操作的方法


其中提供了三个方法:


提交事务:void commit(TransactionStatus status);


回滚事务:void rollback(TransactionStatus status);


获取事务状态信息:TransactionStatus getTransaction(TransactionDefinition definition);


  • TransactionDefinition: 事务的定义信息对象


其中有以下五个方法:


获取事务对象名称:String getName();


获取事务的隔离级:int getIsolationLevel();


获取事务的传播行为:int getPropagationBehavior();


获取事务的超时时间:int getTimeout();


获取事务是否只读:boolean isReadOnly();


  • TransactionStatus: 事务具体的运行状态


包括六个具体操作:


刷新事务:void flush();


获取是否存在存储点:boolean hasSavepoint();


获取事务是否完成:boolean isCompleted();


获取事务是否为新的事务:boolean isNewTransaction();


获取事务是否回滚:boolean isRollbackOnly();


设置事务回滚:void setRollbackOnly();


有关事务的相关信息:


事务的隔离级别:


(1)DEFAULT 默认的隔离级别


(2)READ_UNCOMMITED 可以读取未提交的改变了的数据。


(3)READ_COMMITTED 只能读取已提交的数据,解决了脏读问题(Oracle 的默认级别)


(4)REPEATABLE_READ 是否读取其他事务提交修改后的数据,解决不可重复读问题(MySQL 默认级别)


(5)SERIALIZABLE 是否读取其他事务提交添加后的数据,解决幻读问题



事务的传播行为:


(1)REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)


(2)SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)


(3)MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常


(4)REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。


(5)NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起


(6)NEVER:以非事务方式运行,如果当前存在事务,抛出异常


(7)NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 REQUIRED 类似的操作。



超时时间:


默认值是-1,没有超时限制。如果有,以秒为单位进行设置。


是否是只读事务:


只读一般对应查询操作,读写对应增删改操作,建议查询时设置为只读


[](


)基于注解的事务控制




基于注解的声明式事务控制,我们需要进行一下操作


  • 1、配置事务管理器

  • 2、开启 spring 对注解事务的支持

  • 3、在需要事务支持的地方使用 @Transactional 注解


配置 bean.xml 文件


<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans"


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


xmlns:aop="http://www.springframework.org/schema/aop"


xmlns:tx="http://www.springframework.org/schema/tx"


xmlns:context="http://www.springframework.org/schema/context"


xsi:schemaLocation="http://www.springframework.org/schema/beans


http://www.springframework.org/schema/beans/spring-beans.xsd


http://www.springframework.org/schema/aop


http://www.springframework.org/schema/aop/spring-aop.xsd


http://www.springframework.org/schema/tx


http://www.springframework.org/schema/tx/spring-tx.xsd


http://www.springframework.org/schema/context


http://www.springframework.org/schema/context/spring-context.xsd


http://www.springframework.org/schema/cache


http://www.springframework.org/schema/cache/spring-cache.xsd">


<context:component-scan base-package="com.ly"></context:component-scan>


<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">


<property name="dataSource" ref="dataSource"></property>


</bean>


<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">


<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>


<property name="url" value="jdbc:mysql://localhost:3306/spring?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false"></property>


<property name="username" value="root"></property>


<property name="password" value="520992"></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>


</beans>


要想进行事务控制,我们应该在在业务层去实现,接下来配置账户的业务层


/**


  • @Author: Ly

  • @Date: 2020-08-05 18:57

  • 账户的业务层接口


*/


public interface IAccountService {


/**


  • 转账

  • @param sourceName 转成账户名称

  • @param targetName 转入账户名称

  • @param money 转账金额


*/


void transfer(String sourceName, String targetName, Float money);


}


/**


  • @Author: Ly

  • @Date: 2020-08-05 19:00

  • 账户的业务层实现类


*/


@Service("accountService")


@Transactional(propagation = Propagation.SUPPORTS,readOnly = true)//只读型事务配置


public class AccountServiceImpl implements IAccountService {


@Autowired


private IAccountDao accountDao;


//读写型事务配置


@Transactional(propagation = Propagation.SUPPORTS,readOnly = false)


public void transfer(String sourceName, String targetName, Float money) {


System.out.println("transfer");


//2.1.根据名称查询转出账户


Account source=accountDao.find


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


AccountByName(sourceName);


//2.2.根据名称查询转入账户


Account target=accountDao.findAccountByName(targetName);


//2.3.转出账户减钱


source.setMoney(source.getMoney()-money);


//int i=1/0;


//2.4.转给账户加钱


target.setMoney(target.getMoney()+money);


//2.5.更新装出账户


accountDao.updateAccount(source);


//2.6.更新转入账户


accountDao.updateAccount(target);


}


}


配置账户的持久层:


/**


  • @Author: Ly

  • @Date: 2020-08-05 12:17


*/


public interface IAccountDao {


/**


  • 根据名称查询账户

  • @param accountName

  • @return


*/


Account findAccountByName(String accountName);


/**


  • 更新账户

  • @param account


*/


void updateAccount(Account account);


}


/**


  • @Author: Ly

  • @Date: 2020-08-05 12:20


*/


@Repository("accountDao")


public class AccountDaoImpl implements IAccountDao {


@Autowired


private JdbcTemplate jdbcTemplate;

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
Spring--声明式事务控制,mysql索引教程