事务支持什么是事务?

事务支持什么是事务?
事务处理的四个过程开启事务执行业务代码提交事务没出现异常提交成功。commit transaction回滚事务出现异常。执行回滚事务. rollback transaction事务的四个特性ACIDA原子性事务是最小的工作单元不可分C一致性事务要么同时成功要么同时失败I隔离性事务与事务之间保证和互不干扰D持久性持久性是事务结束的标志。spring对事务的支持spring实现事务的2种方式编程式事务通过编写代码的方式来实现事务管理声明式事务基于注解方式和基于xml方式推荐使用spring事务管理apispring对事务的管理是基于aop实现的。所以spring专门针对事务开发了一套api其核心接口如下PlatformTransactionManager 接口。声明式事务基于注解方式实现需要配置xml文件?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xmlns:txhttp://www.springframework.org/schema/tx xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd !-- 组件扫描-- context:component-scan base-packagecom.ali / !-- 配置数据源-- bean iddataSource classcom.alibaba.druid.pool.DruidDataSource property nameurl valuejdbc:mysql://localhost:3306/bank/ property nameusername valueroot/ property namepassword value123456/ property namedriverClassName valuecom.mysql.jdbc.Driver/ /bean !-- 配置jdbcTemplate-- bean idjdbcTemplate classorg.springframework.jdbc.core.JdbcTemplate property namedataSource refdataSource/ /bean !-- 配置事务管理器-- bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManager property namedataSource refdataSource/ /bean !-- 开启事务注解驱动器开启事务注解需要加上tx的命名空间-- tx:annotation-driven transaction-managertransactionManager/ /beans可以在类和方法上加Transactional 开启事务加在类上表示这个类上的所有方法都开启事务加在方法方法上表示只有这个方法开启事务事务的传播行为什么是事务的传播行为在service种有a和b2个方法a上有事务b上也有事务当a在执行过程中调用了b事务是如何传递的是合并到一个事务还是开启一个新事务这就是事务的传播行为。一共有7种传播行为REQUIRD:支持当前事务如果不存在就新建一个事务默认【没有就新建有就加入】SUPPORTS支持当前事务如果当前没有事务就以非事务方式执行【有就加入没有就不管了】MANDATORY必须运行在一个事务中如果当前没有事务发生将抛出异常【有就加入没有就抛异常】REQUIRES_NEW开启一个新事务如果一个事务已经存在则将这个存在的事务挂起【不管有没有。直接开启一个新事务。新事务和旧事务不存在嵌套关系旧事务被挂起了】NOT_SUPPORTED以非事务方式运行。如果有事务。则挂起当前事务【不支持事务存在就挂起】NEVER以非事务方式运行。如果有事务。则抛异常【不支持事务存在就抛异常】NESTED如果当前有一个事务在进行中则该方法应当运行在一个嵌套事务中。被嵌套的事务可以独立于外层事务进行提交或回滚。如果外层事务不存在。行为就像REQUIRD一样【有事务的话就在这个事务里嵌套一个完全独立的事务嵌套的事务可以独立的提交和回滚。没有事务就和REQUIRD一样】在代码中设置事务的传播行为Transactional(propagation Propagation.MANDATORY)事务隔离级别数据库中读取数据存在三大问题脏读读取到没有提交到数据库的数据不可重复读在同一个事务中第一次和第二次读取的数据不一样幻读读到的数据是假的事务的隔离级别有4个读未提交READ_UNCOMMITTED 存在脏读、不可重复读、幻读问题读提交READ_COMMITTED事务提交之后才读到。存在不可重复读、幻读问题可重复读REPEATABLE_READ解决不可重复读的问题存在幻读问题序列化SERIALIZABLE解决幻读问题事务排队执行。不支持并发。MySQL默认可重复读Oracle默认读提交仅在读的事务中设置隔离级别就行写的事务没必要设置代码中设置事务的隔离级别Transactional(isolation Isolation.DEFAULT)事务超时Transactional(timeout 10)以上代码设置事务超时时间为10s表示超过10s如果事务中所有的DML语句还没有执行完毕的话最终结果会回滚。默认值-1表示没有时间限制。事务的超时时间值得是哪段时间在当前事务中最后一条DML语句执行之前的时间如果最后一条DML语句后面有很多业务逻辑这些业务代码执行的时间不被计入超时时间。只读事务Transactional(readOnly true)将当前事务设为只读事务在该事务中只允许执行select 语句。该特性的作用是启动spring的优化策略。提高select语句的执行效率。设置哪些异常回滚事务Transactional(rollbackFor RuntimeException.class)表示发生RuntimeException异常或该异常的子类异常才回滚设置哪些异常不回滚事务Transactional(noRollbackFor NullPointerException.class)表示发生NullPointerException异常或该异常的子类不回滚其他异常才回滚事务的全注解式开发编写配置类Configuration // 代替xml配置文件 ComponentScan(com.ali) // 扫描com.ali包下的所有类 EnableTransactionManagement // 开启事务管理 public class Spring6Config { // Bean注解用于将方法的返回值注册为Spring容器中的一个Bean Bean(name druidDataSource) public DruidDataSource druidDataSource() { DruidDataSource druidDataSource new DruidDataSource(); druidDataSource.setUrl(jdbc:mysql://localhost:3306/spring6?useSSLfalseserverTimezoneUTC); druidDataSource.setUsername(root); druidDataSource.setDriverClassName(com.mysql.jdbc.Driver); druidDataSource.setPassword(123456); return druidDataSource; } Bean(name transactionManager) public DataSourceTransactionManager transactionManager(DataSource dataSource) { DataSourceTransactionManager transactionManager new DataSourceTransactionManager(); transactionManager.setDataSource(dataSource); return transactionManager; } Bean(name jdbcTemplate) // 该方法的参数DataSource dataSource会自动从Spring容器中找到类型为DataSource的Bean并注入 public JdbcTemplate jdbcTemplate(DataSource dataSource) { JdbcTemplate jdbcTemplate new JdbcTemplate(); jdbcTemplate.setDataSource(dataSource); return jdbcTemplate; } }使用时和其他方式一样。