马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
事件支持
什么是事件?
在一个业务流程中,必要多条DML(insert、delete、update)语句团结才气完成。这些语句必须同时乐成大概同时失败。如许才气包管数据安全。
多条DML同时乐成大概同时失败,叫服务务。
事件处理处罚的四个过程
- 开启事件
- 实行业务代码
- 提交事件(没出现非常,提交乐成。commit transaction)
- 回滚事件(出现非常。实行回滚事件. rollback transaction)
事件的四个特性(ACID)
- A原子性:事件是最小的工作单位,不可分
- C同等性:事件要么同时乐成,要么同时失败
- I隔离性:事件与事件之间包管和互不干扰
- D长期性:长期性是事件竣事的标记。
spring对事件的支持
spring实现事件的2种方式:
- 编程式事件:通过编写代码的方式来实现事件管理
- 声明式事件:基于注解方式和基于xml方式(保举利用)
spring事件管理api
spring对事件的管理是基于aop实现的。以是spring专门针对事件开辟了一套api,其核心接口如下:PlatformTransactionManager 接口。
声明式事件基于注解方式实现
必要设置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:context="http://www.springframework.org/schema/context"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://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-package="com.ali" />
- <bean id="dataSource" >
- <property name="url" value="jdbc:mysql://localhost:3306/bank"/>
- <property name="username" value="root"/>
- <property name="password" value="123456"/>
- <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
- </bean>
- <bean id="jdbcTemplate" >
- <property name="dataSource" ref="dataSource"/>
- </bean>
- <bean id="transactionManager" >
- <property name="dataSource" ref="dataSource"/>
- </bean>
- <tx:annotation-driven transaction-manager="transactionManager"/>
- </beans>
复制代码 可以在类和方法上加@Transactional 开启事件
- 加在类上表现这个类上的全部方法都开启事件
- 加在方法方法上表现只有这个方法开启事件
事件的流传活动
什么是事件的流传活动?
在service种有a()和b()2个方法,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?useSSL=false&serverTimezone=UTC");
- 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;
- }
- }
复制代码 利用时和其他方式一样。
免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金. |