首页 文章 精选 留言 我的

精选列表

搜索[orm框架],共10000篇文章
优秀的个人博客,低调大师

spring框架入门之事务控制

1. 关于事务控制 事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。 1.1 spring中事务控制API PlatformTransactionManager 接口提供事务操作的方法,包含三个具体的操作 public interface PlatformTransactionManager extends TransactionManager { // 获取事务状态信息 TransactionStatus getTransaction(@Nullable TransactionDefinition var1) throws TransactionException; // 提交事务 void commit(TransactionStatus var1) throws TransactionException; // 回滚事务 void rollback(TransactionStatus var1) throws TransactionException; } 开发中常用的实现类: org.springframework.jdbc.datasource.DataSourceTransactionManager :使用Spring JDBC或iBatis进行持久化数据时使用 spring中事务控制接口的结构 1.1.2 TransactionDefinition 事务的定义信息对象,包含如下方法: 获取事务对象名称:String getName() 获取事务隔离级别:int getIsolationLevel() 获取事务传播行为:int getPropagationBehavior() 获取事务超时时间:int getTimeout() 获取事务是否只读:boolean isReadOnly() 1.1.3 TransactionStatus 描述了某个时间点上事务对象的状态信息,包含6个具体的操作: 刷新事务:void flush() 获取是否存在储存点:boolean hasSavepoint() 获取事务是否完成:boolean isCompleted() 获取事务是否为新的事物:boolean isNewTransaction() 获取事务是否回滚:boolean isRollbackOnly() 设置事务回滚:void set RollbackOnly() 1.2 事务的隔离级别 事务的隔离界别反映事务提交并发访问时的处理态度 1.2.1 事务隔离的级别 ① ISOLATION_DEFAULT 默认级别,由 DBA 默认的设置来决定隔离级别,归属下列某一种 ② ISOLATION_READ_UNCOMMITTED 就是一个事务可以读取另一个未提交事务的数据。会出现脏读、不可重复读、幻读(隔离级别最低,但并发性高) ③ ISOLATION_READ_COMMITTED 就是一个事务要等另一个事务提交后才能读取数据,解决脏读问题。会出现不可重复读、幻读问题(锁定正在读取的行,适用于大多数系统,Oracle默认级别) ④ ISOLATION_REPEATABLE_READ 就是在开始读取数据(事务开启)时,不再允许修改操作,解决不可重复读问题。会出现幻读问题(锁定所读的所有行,MYSQL默认级别) ⑤ ISOLATION_SERALZABLE 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。(锁整表) 事务隔离级别由上到下依次提升,隔离级别越高,越能保证数据的完整性和一致性。但对数据库性能的消耗依次增加,并发执行效率依次下降。 大多数的数据库默认隔离级别为 Read Commited,比如 SqlServer、Oracle 少数数据库默认隔离级别为:Repeatable Read 比如:MySQL InnoDB 1.2.2 数据库读取时会出现的三种问题 ① Dirty reads:读脏数据。 也就是说,比如事务A的未提交(还依然缓存)的数据被事务B读走,如果事务A失败回滚,会导致事务B所读取的的数据是错误的。 ② non-repeatable reads:数据不可重复读。 比如事务A中两处读取数据price的值。在第一读的时候,price是100,然后事务B就把price的值改成 200;事务A再读一次,结果就发现,price竟然就变成200了,造成事务A数据混乱。 ③ phantom reads:幻象读数据。 这个和non-repeatable reads相似,也是同一个事务中多次读不一致的问题。但是 non-repeatable reads 的不一致是因为他所要取的数据值被改变了(比如price)而 phantom reads 所要读的数据的不一致却是他的条件数据集发生变化了。 比如:执行 Select account.id where account.name="Bruce*",第一次读去了6个符合条件的id;第二次读取的时候,由于事务B把一个帐号的名字由"dd"改成"Bruce1",结果取出来了7个数据。 不可重复读的重点是修改:同样的条件,两次读发现值不一样; 幻读的重点在于新增或者删除:同样的条件,两次读发现得到的记录数不一样 1.2.3 数据隔离级别和出现的问题之间的关联 Dirty reads non-repeatable reads phantom reads READ_UNCOMMITTED Y Y Y READ_COMMITTED N Y Y REPEATABLE_READ N N Y SERALZABLE N N N 1.3 事务的传播行为 REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选 择(默认值) SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务) MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。 REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。 NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 NEVER:以非事务方式运行,如果当前存在事务,抛出异常。 NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行REQUIRED类似的操作。 1.4 超时时间 指事务提交后最长可以等待的时间,超出时间则会自动失败。默认值是-1,没有时间限制。如果有,则以秒为单位进行设置。 1.5 是否为只读事务 读写型事务:增加、删除、修改时开启事务 只读型事务:执行查询时,也会开启事务 2. 基于xml的事务控制配置 2.1 配置步骤 配置事务管理器 配置事务的通知 此时我们需要导入事务的约束 tx名称空间和约束,同时也需要aop的使用 <tx:advice> 标签配置事务通知 id:给事务通知起一个唯一标识 transaction-manager:给事务通知提供一个事务管理器引用 配置AOP中的通用切入点表达式 建立事务通知和切入点表达式的对应关系 配置事务的属性是在事务的通知 <tx:advice> 标签的内部 2.2 配置事务的属性 isolation:用于指定事务的隔离级别。默认值是 DEFAULT,表示使用数据库的默认隔离级别。 propagation:用于指定事务的传播行为。默认值是 REQUIRED,表示一定会有事务,增删改的选择。查询方法可以选择 SUPPORTS。 read-only:用于指定事务是否只读。只有查询方法才能设置为 true。默认值是false,表示读写。 timeout:用于指定事务的超时时间,默认值是-1,表示永不超时。如果指定了数值,以秒为单位。 rollback-for:用于指定一个异常,当产生该异常时,事务回滚,产生其他异常时,事务不回滚。没有默认值。表示任何异常都回滚。 no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时事务回滚。没有默认值。表示任何异常都回滚。 代码示例: <?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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 配置数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/base_crud"></property> <property name="username" value="root"></property> <property name="password" value="123456"></property> </bean> <!-- 1.配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 2.配置事务通知 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" read-only="false"></tx:method> <tx:method name="get*" propagation="SUPPORTS" read-only="true"></tx:method> </tx:attributes> </tx:advice> <!-- 3.配置AOP --> <aop:config> <aop:pointcut id="pointcut" expression="execution(* cn.bruce.service.impl.*.*(..))"/> <!-- 4.建立事务通知和切入点表达式的对应关系 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"></aop:advisor> </aop:config> <!-- 配置dao --> <bean id="accountDao" class="cn.bruce.dao.impl.AccountDaoImpl"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置service --> <bean id="accountService" class="cn.bruce.service.impl.AccountServiceImpl"> <property name="accountDao" ref="accountDao"></property> </bean> </beans> 3. 基于注解的事务控制配置 3.1 配置步骤 ① 书写配置类 ② 将对象注入到IoC容器中管理 ③ 给业务添加事务注释,并指明事务属性 代码示例: ① 配置spring @Configuration// 声明为配置类 @ComponentScan("cn.bruce")// 声明需要扫描的包 @Import({JdbcConfig.class, TransactionConfig.class})// 导入其他配置类 @PropertySource("jdbcConfig.properties")// 导入配置文件 @EnableAspectJAutoProxy(proxyTargetClass = true)// 开启注解支持 @EnableTransactionManagement// 开启事务控制 public class SpringConfiguration { } ② 配置jdbc public class JdbcConfig { @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; /** * 创建数据源对象 * @return */ @Bean("dataSource") public DataSource creatDataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(driver); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } /** * 创建JdbcTemplate * @param dataSource * @return */ @Bean(name = "jdbcTemplate") public JdbcTemplate creatJdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } } ③ 配置事务控制器 public class TransactionConfig { /** * 用于创建事务管理器对象 * @param dataSource * @return */ @Bean(name = "transactionManager") public PlatformTransactionManager creatTransactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } } ④ 通过 @Repository 和 @service 注解将Dao和Service层对象注入IoC容器 ⑤ 在业务层使用 @Transactional 注解进行事务配置 // 进行读写型事务配置 @Transactional(propagation = Propagation.REQUIRED, readOnly = false) @Override public void transfer(String sourceName, String targetName, Float money) { System.out.println("开始进行转账操作。。。"); Account source = accountDao.getAccountByName(sourceName); Account target = accountDao.getAccountByName(targetName); source.setMoney(source.getMoney() - money); target.setMoney(target.getMoney() + money); accountDao.updateAccount(source); int i = 1/0; accountDao.updateAccount(target); System.out.println("转账完成。。。"); } ⑥ 书写测试类进行测试 3.2 涉及到的注解 @Transactional 此注解相当于xml配置中的 <tx:attributes>****</tx:attributes> 用于进行事务的配置,其属性含义和xml中是一致的 此注解可是使用在接口、类和方法上: 出现在接口上,表示此接口所有的实现类都有事务支持 出现在类上,表示类所有的方法都有事务支持 出现在方法上,表示此方法有事务支持 以上三个位置的优先级:方法 > 类 > 接口

优秀的个人博客,低调大师

CakePHP 4.0.8 发布,PHP 快速开发框架

CakePHP 4.0.8 发布了,这是 4.0 分支的维护版本,修复了多个社区报告的问题。 Bugfixes 更新 API 文档和方法键入 修复HH:mm的编组日期时间值 删除IntegrationTestTrait方法中的@throws注释 修复了FormHelper中错误值的处理。现在使用 0代替'' 改进 CSRF 验证错误消息 修复了集成测试中显示为空数组的application/www-form-urlencoded有效负载 XmlView不再尝试获取非数组值的键 更新说明:https://github.com/cakephp/cakephp/releases/tag/4.0.8

优秀的个人博客,低调大师

go-snake 框架 1.0.2 发布喽

本次主要更新内容: 新增 健康检查接口,便于对应用进行探活检测 新增 metrics接口,便于prometheus进行监控 新增 scripts目录,将各种脚本文件统一放到此目录 新增 schedule目录,可以配置需要跑的计划任务 新增 支持发送邮件模块 优化 main.go 更新 在repo README 中增加使用建议 更多更新日志可以看这里:https://github.com/1024casts/snake/blob/master/CHANGELOG.md

优秀的个人博客,低调大师

Apache Flink 1.9.3 发布,流处理框架

Apache Flink 1.9.3 已发布,这是Apache Flink 1.9 系列的第三个 bugfix 版本,总共包含 38 个修复程序以及针对 Flink 1.9.2 的改进。 部分更新内容: [FLINK-14278] - 将 ioExecutor 传入 AbstractDispatcherResourceManagerComponentFactory [FLINK-15908] - 在 1.9.x 文档中添加支持'pip install'的描述 [FLINK-15909] - 在后续1.9.x 版本中加入 PyPI 的发布流程 [FLINK-15938] - 修复StreamingJoinOperator 和 StreamingSemiAntiJoinOperator 中空闲状态没有被清理的问题 [FLINK-16018] - 改进提交批处理作业时的错误报告(代替 AskTimeoutException) [FLINK-16031] - 改进 PyFlink 1.9.x README 文件中的描述 [FLINK-16167] - 升级关于 python shell 执行的文档 [FLINK-16280] - 修复关于 elasticsearch 连接器文档中的示例代码错误 [FLINK-16697] - 禁用 JMX 重新绑定功能 [FLINK-16862] - 移除 quickstarts 中的示例 url [FLINK-16942] - ES 5 sink 支持用户选择 netty 传输客户端 详情查看https://flink.apache.org/news/2020/04/24/release-1.9.3.html 下载地址https://flink.apache.org/downloads.html#apache-flink-193 Apache Flink 项目的目标是开发一个流处理系统,以统一和支持多种形式的实时和离线数据处理应用程序以及事件驱动的应用程序。​​​​​​​

优秀的个人博客,低调大师

CakePHP 4.0.4 发布,PHP 快速开发框架

CakePHP 4.0.4 发布了,更新内容如下: Bugfixes Http\Response::$_contentType被删除,因为它经常出错并且与 getHeader('Content-Type') 值不同步 NumberHelper::precision()添加了 $options 参数,以便更好地包装Number::precision() 将 timestamptimezone 映射添加到 FormHelper 和 DateTimeWidget 使用 disableErrorHandlerMiddleware() 时,IntegrationTestCaseTrait 再次引发异常 仅当步长小于 1 时,DateTimeWidget 才会以毫秒为单位显示 datetime-local 值 改进 API 文档 更多内容见更新说明: https://bakery.cakephp.org/2020/02/21/cakephp_404_released.html

优秀的个人博客,低调大师

Apache Flink 1.9.2 发布,流处理框架

Apache Flink 1.9.2 发布了,Apache Flink 项目的目标是开发一个流处理系统,以统一和支持多种形式的实时和离线数据处理应用程序以及事件驱动的应用程序。 此版本带来大量 bug 修复,摘取部分如下: Bug [FLINK-10377] - 删除 TwoPhaseCommitSinkFunction.notifyCheckpointComplete 中的前提条件 [FLINK-10435] - Ctrl + C 之后客户端偶尔会挂起 [FLINK-11120] - TIMESTAMPADD 函数无法正确处理 TIME [FLINK-11835] - ZooKeeperLeaderElectionITCase.testJobExecutionOnClusterWithLeaderChange 失败 [FLINK-12342] - Yarn 资源管理器获取太多的容器 [FLINK-12399] - FilterableTableSource 在作业运行时不使用过滤器 [FLINK-13184] - 启动 TaskExecutor 会阻止 YarnResourceManager 的主线程 [FLINK-13589] - 具有整个文件输入拆分的多字节定界符上的 DelimitedInputFormat 索引错误 [FLINK-13702] - 在 Travis 上 BaseMapSerializerTest.testDuplicate 失败 …… 更新说明:https://flink.apache.org/news/2020/01/30/release-1.9.2.html

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册