- Spark(三十五)troubleshooting之错误的持久化方式以及checkpoint的使用
文子轩
一、背景错误的持久化使用方式:usersRDD,想要对这个RDD做一个cache,希望能够在后面多次使用这个RDD的时候,不用反复重新计算RDD;可以直接使用通过各个节点上的executor的BlockManager管理的内存/磁盘上的数据,避免重新反复计算RDD。usersRDD.cache()usersRDD.count()usersRDD.take()上面这种方式,不要说会不会生效了,实际上
- 深入理解Spark BlockManager:定义、原理与实践
涤生大数据
spark大数据分布式
深入理解SparkBlockManager:定义、原理与实践1.定义Spark是一个开源的大数据处理框架,其主要特点是高性能、易用性以及可扩展性。在Spark中,BlockManager是其核心组件之一,它负责管理内存和磁盘上的数据块,并确保这些数据块在集群中的各个节点上可以高效地共享和访问,其中包括存储、复制、序列化和反序列化数据块,并且负责将这些数据块分发到集群中的各个节点上,以便进行计算。B
- Spark源码之CacheManager
小狼星I
Spark源码之CacheManager篇CacheManager介绍1.CacheManager管理spark的缓存,而缓存可以基于内存的缓存,也可以是基于磁盘的缓存;2.CacheManager需要通过BlockManager来操作数据;3.当Task运行的时候会调用RDD的comput方法进行计算,而compute方法会调用iterator方法;CacheManager源码解析既然要说Cac
- Spark-BlockManager、BlockManagerSlaveEndpoint、DiskStore、MemoryStore、BlockInfoManager、BlockInfo 源码解析
姜上清风
Spark源码大数据spark
Spark-BlockManager、DiskStore、MemoryStore、BlockInfoManager、BlockInfo源码解析classBlockInfo&ObjectBlockInfoclassBlockInfoManagerclassMemoryStore&classDiskStoreclassBlockManagerclassBlockManagerSlaveEndpoint
- spark算子大全glom_Spark 算子- Value Transformation
weixin_39736934
spark算子大全glom
Spark算子的作用Spark的输入、运行转换、输出过程,在运行转换中通过算子对RDD进行转换输入:外部数据空间(HDFS、Scala集合)输入Spark,数据进入Spark运行时数据空间,转化为Spark数据块,通过BlockManager管理运行:输入形成RDD后,通过算子操作生成新的RDD,通过Action算子,触发Spark提交作业输出:程序结束数据输出到运行时数据空间,存储到分布式存储或
- Spark 核心组件之BlockManager数据存储与管理机制
Map_Reduce
BlockManager是整个Spark底层负责数据存储与管理的一个组件,Driver和Executor的所有数据都由对应的BlockManager进行管理。 Driver上有BlockManagerMaster,负责对各个节点上的BlockManager内部管理的数据的元数据进行维护,比如block的增删改等操作,都会在这里维护好元数据的变更。 每个节点都有一个BlockManager,
- spark运行级别问题详解
君子慎独焉
本地化级别PROCESS_LOCAL进程本地化,代码和数据在同一个进程中,也就是在同一个executor中;计算数据的task由executor执行,数据在executor的BlockManager中;性能最好NODE_LOCAL节点本地化,代码和数据在同一个节点中;比如说,数据作为一个HDFSblock块,就在节点上,而task在节点上某个executor中运行;或者是,数据和task在一个节点
- Hadoop没有启动datanodes
vickeex
采用Hadoop自带的基准测试工具写入文件时,出现问题:Thereare0datanode(s)runningand0node(s)areexcludedinthisoperation.atorg.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget4NewBlock(BlockManager.java:2205)a
- 【HDFS】BlockManager#checkRedundancy方法详解
叹了口丶气
HDFS全方位实战hdfshadoop大数据
BlockManager#checkRedundancy这个方法只有一处调用点,就是FSNamesystem#finalizeINodeFileUnderConstruction方法。TODO:补充FSNamesystem#finalizeINodeFileUnderConstruction方法的调用点。checkRedundancy方法的参数的BlockCollection对象bc,解释一下,I
- SPARK 是怎么清除Shuffle中间结果数据的
鸿乃江边鸟
大数据spark分布式sparkbigdata大数据
背景本文基于SPARK3.2.1我们知道在Spark中,shuffle的数据会存在ESS或者BlockManager中的,但是spark什么时候会删除shuffle的中间结果数据呢?这篇文章我们来分析一下分析我们知道spark肯定会删除shuffle结果数据,要不然长期以往,磁盘肯定会爆掉。其中清除的组件就是ContextCleaner,代码如下:private[spark]classContex
- 45、Spark内核源码深度剖析之BlockManager原理剖析与源码分析
ZFH__ZJ
流程图BlockManager原理剖析.pngDriver上,有BlockManagerMaster,它的功能,就是负责对各个节点上的BlockManager内部管理的数据的元数据进行维护,比如Block的增删改等操作,都会在这里维护元数据的变更每个节点上,都有BlockManager,BlockManager上有几个关键组件DiskStore,负责对磁盘上的数据进行读写MemoryStore,负
- Spark内核解析之七:核心组件解析
SunnyRivers
Sparkspark广播变量累加器BlockManager
BlockManager数据存储与管理机制BlockManager是整个Spark底层负责数据存储与管理的一个组件,Driver和Executor的所有数据都由对应的BlockManager进行管理。Driver上有BlockManagerMaster,负责对各个节点上的BlockManager内部管理的数据的元数据进行维护,比如block的增删改等操作,都会在这里维护好元数据的变更。每个节点都有
- Spark运行原理
不会编程的小小怪
Spark大数据spark分布式
1.BlockManagerBlockManager是Spark的分布式存储系统主从结构:BlockManagerMaster/BlockManager(Slave)BlockManagerMaster在Driver端启动:负责接受Executor上的BlockManager的注册管理BlockManager的元数据信息BlockManager在每个Executor中启动:负责管理所在节点上的数据
- spark的RDD五大特点
吴国友
RDD的5大特点1)有一个分片列表,就是能被切分,和Hadoop一样,能够切分的数据才能并行计算。一组分片(partition),即数据集的基本组成单位,对于RDD来说,每个分片都会被一个计算任务处理,并决定并行计算的粒度。用户可以在创建RDD时指定RDD的分片个数,如果没有指定,那么就会采用默认值。默认值就是程序所分配到的CPUCore的数目。每个分配的存储是由BlockManager实现的,每
- 【Spark】Spark 存储原理--读数据过程
w1992wishes
本篇结构:读取数据块过程内存读取磁盘读取远程读取一、读取数据块过程BlockManager的get方法是读数据的入口点,有本地读取和远程读取两个分叉口。本地读取使用getLocalValues方法,根据存储级别的不同,使用MemoryStore.getValues或者DiskStore.getBytes读取数据。远程读取使用getRemoteValues方法,调用远程数据传输服务类BlockTra
- BlockManager
搞什么呀
架构简介BlockManager是一个嵌入在spark中的key-value型分布式存储系统,是为spark量身打造的,BlockManager在一个spark应用中作为一个本地缓存运行在所有的节点上,包括所有driver和executor上。BlockManager对本地和远程提供一致的get和set数据块接口,BlockManager本身使用不同的存储方式来存储这些数据,包括memory,di
- spark源码(六)spark如何通过BlockManager控制数据的读写
Interest1_wyt
源码系列大数据spark
spark几乎所有的读写功能都由BlockManager模块实现,且所有的BlockManager受BlockManagerMaster协调管理,它们的大致关系如下图所示(这里并没有把BlockManagerMaster和BlockManager中的所有子模块都罗列出来,这里只是罗列了和我们疑问有关联的模块):driver上启动BlockManagerMaster、BlockManager,其存储
- 这样的spark你喜欢吗?
清风_d587
BlockManager定义BlockManager是Spark的分布式存储系统,与我们平常说的分布式存储系统是有区别的,区别就是这个分布式存储系统只会管理Block块数据,它运行在所有节点上。BlockManager的结构是Maser-Slave架构,Master就是Driver上的BlockManagerMaster,Slave就是每个Executor上的BlockManager。BlockM
- Spark Core源码精读计划#29:BlockManager主从及RPC逻辑
LittleMagic
目录前言初始化BlockManagerMaster与RPC端点主RPC端点BlockManagerMasterEndpoint构造方法与属性成员接受并回复RPC消息例:处理BlockManager注册例:处理BlockManager心跳从RPC端点BlockManagerSlaveEndpointBlockManagerMaster总结前言通过前面几篇文章的讲解,我们就把SparkCore存储体系
- Spark - 说说存储的那些事
spark
前面已经差不多把执行的流程都讲完了,这篇讲讲每个Task执行的结果是如何存储和读取的。BlockManagerBlockManager是SparkEnv中的组件之一,存储体系的所有组件和功能都是依赖着BlockManager,包括之前提到的ShuffleManager、DiskBlockManager、MapOutputTracker等,这篇会的流程也会再讲解一次。BlockManagerMast
- 8.2 Shuffle 过程之 MapOutputTracker
GongMeng
1.概述MapOutputTracker用来跟踪中间过程Stage的输出,为后续的shuffle过程准备好上游的数据.这些数据的句柄由BlockManager来管理,大小由BlockManager来估计.在Driver端跑着MapOutputTrackerMaster在Executor端跑着MapOutputTrackerWorker通信使用的是一个注册到akka的RPC调用MapOutputTr
- TFS的NameServer / DataServer / RsServer / MetaServer
蓝色_fea0
NameServer中的BlockManage和Servermanage的介绍1.BlockManager用来管理所有来自DataServer和Block的信息因为Block的数量非常多,所以BlockManage将Block组织成一个HashMap的结构(它的桶的数量可以在参数MAX_BLOCK_CHUNK_NUMS中设置).它还定义了一个双向队列,用于对要删除的Block进行管理,在规定的时间
- Spark的分布式存储系统BlockManager全解析
华为云开发者社区
spark分布式存储过程
摘要:BlockManager是spark中至关重要的一个组件,在spark的运行过程中到处都有BlockManager的身影,只有搞清楚BlockManager的原理和机制,你才能更加深入的理解spark。§BlockManager是什么?BlockManager的作用?我理解是负责做RDD的存储,如何存下来给后续任务去使用。其内部模块图如下:图中看到有个memoryStore和DiskStor
- Spark的分布式存储系统BlockManager全解析
华为云开发者社区
spark分布式存储过程
摘要:BlockManager是spark中至关重要的一个组件,在spark的运行过程中到处都有BlockManager的身影,只有搞清楚BlockManager的原理和机制,你才能更加深入的理解spark。§BlockManager是什么?BlockManager的作用?我理解是负责做RDD的存储,如何存下来给后续任务去使用。其内部模块图如下:图中看到有个memoryStore和DiskStor
- Spark-Shuffle机制详解
Rabcheng
大数据-Sparkspark大数据
Shuffle机制详解什么是Shuffle?shuffle中文翻译为洗牌,需要shuffle的关键性原因是某种具有共同特征的数据需要最终汇聚到一个计算节点上进行计算。发生在map方法之后,reduce方法之前。Shuffle一般包含两阶段任务:第一阶段:产生shuffle数据的阶段(map阶段)补充:是ShuffleManager中的getWriter来写数据(数据可以通过BlockManager
- Spark-BlockManager
Rabcheng
大数据-Sparkspark大数据
简单说明BlockManager是管理整个Spark运行时数据的读写,包含数据存储本身,在数据存储的基础之上进行数据读写。由于Spark是分布式的,所有BlockManager也是分布式的,BlockManager本身相对而言是一个比较大的模块,Spark中有非常多的模块:调度模块、资源管理模块等等。BlockManager是另外一个非常重要的模块,BlockManager本身源码量非常大。本篇从
- Spark的算子分类及功能
qq_34758244
spark
Spark的算子分类及功能Spark的算子作用1.输入:在Spark程序运行中,数据从外部数据空间输入Spark,数据进入Spark运行时数据空间,转化为Spark中的数据块,通过BlockManager进行管理2.运行:在Spark数据输入形成RDD后便可以通过变换算子,如filter等,对数据进行操作并将RDD转化为新的RDD,通过Action算子,触发Spark提交作业。如果数据需要复用,可
- spark(三):blockManager、broadcast、cache、checkpoint
weixin_34293246
blockManagerDriver和executor上分别都会启动blockManager,其中driver上拥有所有executor上的blockManager的引用;所有executor上的blockManager都持有driver上的blockManager的引用;blockManagerSlave会不断向blockManagerMaster发送心跳,更新block信息等;BlockMan
- spark core 2.0 Broadcast TorrentBroadcast
houzhizhen
spark
一个比特流类似的一个广播实现。它的机制如下:Driver把序列化的对象分成小块,并且存在driver的BlockManager之中,并且汇报给BlockManagerMaster.在每一个执行器中,执行器首先从他自己的BlockManager中读到对象。如果对象不存在,则从BlockManagerMaster获取对象的地址,这时是driver,然后从该地址中读出对象,放到本地的BlockManag
- spark BlockManager如何实现Broadcast广播
tydhot
spark
当通过SparkContext调用broadcast()方法的时候,将会直接尝试调用BroadcastFactory的newBroadcast()方法,BroadcastFactory的默认实现是TorrentBroadcastFactory,在其newBroadcast()方法中,实际上就是new了一个TorrentBroadcast。在TorrentBroadcast的初试化流程中,将会通过w
- LeetCode[位运算] - #137 Single Number II
Cwind
javaAlgorithmLeetCode题解位运算
原题链接:#137 Single Number II
要求:
给定一个整型数组,其中除了一个元素之外,每个元素都出现三次。找出这个元素
注意:算法的时间复杂度应为O(n),最好不使用额外的内存空间
难度:中等
分析:
与#136类似,都是考察位运算。不过出现两次的可以使用异或运算的特性 n XOR n = 0, n XOR 0 = n,即某一
- 《JavaScript语言精粹》笔记
aijuans
JavaScript
0、JavaScript的简单数据类型包括数字、字符创、布尔值(true/false)、null和undefined值,其它值都是对象。
1、JavaScript只有一个数字类型,它在内部被表示为64位的浮点数。没有分离出整数,所以1和1.0的值相同。
2、NaN是一个数值,表示一个不能产生正常结果的运算结果。NaN不等于任何值,包括它本身。可以用函数isNaN(number)检测NaN,但是
- 你应该更新的Java知识之常用程序库
Kai_Ge
java
在很多人眼中,Java 已经是一门垂垂老矣的语言,但并不妨碍 Java 世界依然在前进。如果你曾离开 Java,云游于其它世界,或是每日只在遗留代码中挣扎,或许是时候抬起头,看看老 Java 中的新东西。
Guava
Guava[gwɑ:və],一句话,只要你做Java项目,就应该用Guava(Github)。
guava 是 Google 出品的一套 Java 核心库,在我看来,它甚至应该
- HttpClient
120153216
httpclient
/**
* 可以传对象的请求转发,对象已流形式放入HTTP中
*/
public static Object doPost(Map<String,Object> parmMap,String url)
{
Object object = null;
HttpClient hc = new HttpClient();
String fullURL
- Django model字段类型清单
2002wmj
django
Django 通过 models 实现数据库的创建、修改、删除等操作,本文为模型中一般常用的类型的清单,便于查询和使用: AutoField:一个自动递增的整型字段,添加记录时它会自动增长。你通常不需要直接使用这个字段;如果你不指定主键的话,系统会自动添加一个主键字段到你的model。(参阅自动主键字段) BooleanField:布尔字段,管理工具里会自动将其描述为checkbox。 Cha
- 在SQLSERVER中查找消耗CPU最多的SQL
357029540
SQL Server
返回消耗CPU数目最多的10条语句
SELECT TOP 10
total_worker_time/execution_count AS avg_cpu_cost, plan_handle,
execution_count,
(SELECT SUBSTRING(text, statement_start_of
- Myeclipse项目无法部署,Undefined exploded archive location
7454103
eclipseMyEclipse
做个备忘!
错误信息为:
Undefined exploded archive location
原因:
在工程转移过程中,导致工程的配置文件出错;
解决方法:
 
- GMT时间格式转换
adminjun
GMT时间转换
普通的时间转换问题我这里就不再罗嗦了,我想大家应该都会那种低级的转换问题吧,现在我向大家总结一下如何转换GMT时间格式,这种格式的转换方法网上还不是很多,所以有必要总结一下,也算给有需要的朋友一个小小的帮助啦。
1、可以使用
SimpleDateFormat SimpleDateFormat
EEE-三位星期
d-天
MMM-月
yyyy-四位年
- Oracle数据库新装连接串问题
aijuans
oracle数据库
割接新装了数据库,客户端登陆无问题,apache/cgi-bin程序有问题,sqlnet.log日志如下:
Fatal NI connect error 12170.
VERSION INFORMATION: TNS for Linux: Version 10.2.0.4.0 - Product
- 回顾java数组复制
ayaoxinchao
java数组
在写这篇文章之前,也看了一些别人写的,基本上都是大同小异。文章是对java数组复制基础知识的回顾,算是作为学习笔记,供以后自己翻阅。首先,简单想一下这个问题:为什么要复制数组?我的个人理解:在我们在利用一个数组时,在每一次使用,我们都希望它的值是初始值。这时我们就要对数组进行复制,以达到原始数组值的安全性。java数组复制大致分为3种方式:①for循环方式 ②clone方式 ③arrayCopy方
- java web会话监听并使用spring注入
bewithme
Java Web
在java web应用中,当你想在建立会话或移除会话时,让系统做某些事情,比如说,统计在线用户,每当有用户登录时,或退出时,那么可以用下面这个监听器来监听。
import java.util.ArrayList;
import java.ut
- NoSQL数据库之Redis数据库管理(Redis的常用命令及高级应用)
bijian1013
redis数据库NoSQL
一 .Redis常用命令
Redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以在Linux终端使用。
a.键值相关命令
b.服务器相关命令
1.键值相关命令
&
- java枚举序列化问题
bingyingao
java枚举序列化
对象在网络中传输离不开序列化和反序列化。而如果序列化的对象中有枚举值就要特别注意一些发布兼容问题:
1.加一个枚举值
新机器代码读分布式缓存中老对象,没有问题,不会抛异常。
老机器代码读分布式缓存中新对像,反序列化会中断,所以在所有机器发布完成之前要避免出现新对象,或者提前让老机器拥有新增枚举的jar。
2.删一个枚举值
新机器代码读分布式缓存中老对象,反序列
- 【Spark七十八】Spark Kyro序列化
bit1129
spark
当使用SparkContext的saveAsObjectFile方法将对象序列化到文件,以及通过objectFile方法将对象从文件反序列出来的时候,Spark默认使用Java的序列化以及反序列化机制,通常情况下,这种序列化机制是很低效的,Spark支持使用Kyro作为对象的序列化和反序列化机制,序列化的速度比java更快,但是使用Kyro时要注意,Kyro目前还是有些bug。
Spark
- Hybridizing OO and Functional Design
bookjovi
erlanghaskell
推荐博文:
Tell Above, and Ask Below - Hybridizing OO and Functional Design
文章中把OO和FP讲的深入透彻,里面把smalltalk和haskell作为典型的两种编程范式代表语言,此点本人极为同意,smalltalk可以说是最能体现OO设计的面向对象语言,smalltalk的作者Alan kay也是OO的最早先驱,
- Java-Collections Framework学习与总结-HashMap
BrokenDreams
Collections
开发中常常会用到这样一种数据结构,根据一个关键字,找到所需的信息。这个过程有点像查字典,拿到一个key,去字典表中查找对应的value。Java1.0版本提供了这样的类java.util.Dictionary(抽象类),基本上支持字典表的操作。后来引入了Map接口,更好的描述的这种数据结构。
&nb
- 读《研磨设计模式》-代码笔记-职责链模式-Chain Of Responsibility
bylijinnan
java设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/**
* 业务逻辑:项目经理只能处理500以下的费用申请,部门经理是1000,总经理不设限。简单起见,只同意“Tom”的申请
* bylijinnan
*/
abstract class Handler {
/*
- Android中启动外部程序
cherishLC
android
1、启动外部程序
引用自:
http://blog.csdn.net/linxcool/article/details/7692374
//方法一
Intent intent=new Intent();
//包名 包名+类名(全路径)
intent.setClassName("com.linxcool", "com.linxcool.PlaneActi
- summary_keep_rate
coollyj
SUM
BEGIN
/*DECLARE minDate varchar(20) ;
DECLARE maxDate varchar(20) ;*/
DECLARE stkDate varchar(20) ;
DECLARE done int default -1;
/* 游标中 注册服务器地址 */
DE
- hadoop hdfs 添加数据目录出错
daizj
hadoophdfs扩容
由于原来配置的hadoop data目录快要用满了,故准备修改配置文件增加数据目录,以便扩容,但由于疏忽,把core-site.xml, hdfs-site.xml配置文件dfs.datanode.data.dir 配置项增加了配置目录,但未创建实际目录,重启datanode服务时,报如下错误:
2014-11-18 08:51:39,128 WARN org.apache.hadoop.h
- grep 目录级联查找
dongwei_6688
grep
在Mac或者Linux下使用grep进行文件内容查找时,如果给定的目标搜索路径是当前目录,那么它默认只搜索当前目录下的文件,而不会搜索其下面子目录中的文件内容,如果想级联搜索下级目录,需要使用一个“-r”参数:
grep -n -r "GET" .
上面的命令将会找出当前目录“.”及当前目录中所有下级目录
- yii 修改模块使用的布局文件
dcj3sjt126com
yiilayouts
方法一:yii模块默认使用系统当前的主题布局文件,如果在主配置文件中配置了主题比如: 'theme'=>'mythm', 那么yii的模块就使用 protected/themes/mythm/views/layouts 下的布局文件; 如果未配置主题,那么 yii的模块就使用 protected/views/layouts 下的布局文件, 总之默认不是使用自身目录 pr
- 设计模式之单例模式
come_for_dream
设计模式单例模式懒汉式饿汉式双重检验锁失败无序写入
今天该来的面试还没来,这个店估计不会来电话了,安静下来写写博客也不错,没事翻了翻小易哥的博客甚至与大牛们之间的差距,基础知识不扎实建起来的楼再高也只能是危楼罢了,陈下心回归基础把以前学过的东西总结一下。
*********************************
- 8、数组
豆豆咖啡
二维数组数组一维数组
一、概念
数组是同一种类型数据的集合。其实数组就是一个容器。
二、好处
可以自动给数组中的元素从0开始编号,方便操作这些元素
三、格式
//一维数组
1,元素类型[] 变量名 = new 元素类型[元素的个数]
int[] arr =
- Decode Ways
hcx2013
decode
A message containing letters from A-Z is being encoded to numbers using the following mapping:
'A' -> 1
'B' -> 2
...
'Z' -> 26
Given an encoded message containing digits, det
- Spring4.1新特性——异步调度和事件机制的异常处理
jinnianshilongnian
spring 4.1
目录
Spring4.1新特性——综述
Spring4.1新特性——Spring核心部分及其他
Spring4.1新特性——Spring缓存框架增强
Spring4.1新特性——异步调用和事件机制的异常处理
Spring4.1新特性——数据库集成测试脚本初始化
Spring4.1新特性——Spring MVC增强
Spring4.1新特性——页面自动化测试框架Spring MVC T
- squid3(高命中率)缓存服务器配置
liyonghui160com
系统:centos 5.x
需要的软件:squid-3.0.STABLE25.tar.gz
1.下载squid
wget http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE25.tar.gz
tar zxf squid-3.0.STABLE25.tar.gz &&
- 避免Java应用中NullPointerException的技巧和最佳实践
pda158
java
1) 从已知的String对象中调用equals()和equalsIgnoreCase()方法,而非未知对象。 总是从已知的非空String对象中调用equals()方法。因为equals()方法是对称的,调用a.equals(b)和调用b.equals(a)是完全相同的,这也是为什么程序员对于对象a和b这么不上心。如果调用者是空指针,这种调用可能导致一个空指针异常
Object unk
- 如何在Swift语言中创建http请求
shoothao
httpswift
概述:本文通过实例从同步和异步两种方式上回答了”如何在Swift语言中创建http请求“的问题。
如果你对Objective-C比较了解的话,对于如何创建http请求你一定驾轻就熟了,而新语言Swift与其相比只有语法上的区别。但是,对才接触到这个崭新平台的初学者来说,他们仍然想知道“如何在Swift语言中创建http请求?”。
在这里,我将作出一些建议来回答上述问题。常见的
- Spring事务的传播方式
uule
spring事务
传播方式:
新建事务
required
required_new - 挂起当前
非事务方式运行
supports
&nbs