Spring事务传播行为有7种:
spring的7种传播行为:
1.required:(默认传播行为),如果当前有事务,其他就用当前事务,不会新增事务。
例如:方法A调用方法B,它们用同一个事务。(如果B没有事务,它们会用同一个事务。)(只要有一个回滚,整体就会回滚)
2.requires_new:如果当前有事务,其他不会加入当前事务,会新增事务。即他们的事务没有关系,不是同一个事务。
如果其他没有事务,那么以当前事务运行。
例如:方法A调用方法B,它们用不同的事务。(B不会用A的事务,会新增事务。)
3.supports:当前没有事务,就以非事务运行。当前有事务呢?就以当前事务运行。
例如:方法A调用方法B,如果A没有事务,那么B就以非事务运行。
如果A有事务就以A事务为准。如果A没有事务,那么B就会以非事务执行。
4.mandatory:其他没有事务就会抛异常。当前没有事务抛出异常,当前有事务则支持当前事务。
支持当前事务,如果当前没有事务就会抛出异常。
例如:方法A调用方法B,如果方法A没有事务,那么就会抛出异常。
5.not_supported:以非事务执行。
例如:方法A调用方法B,方法B会挂起事务A以非事务方式执行。
6.never:以非事务执行,如果存在事务,抛出异常。
总是以非事务执行,如果存在事务,那么就抛出异常。
7.nested:如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。
如果当前事务不存在,那么其行为与Required一样。
例如:方法A中调用了方法B,B中try catch手动回滚,A不会回滚。
======================================
1.required:(默认传播行为),如果当前有事务,其他就用当前事务,不会新增事务。
例如:方法A调用方法B,它们用同一个事务。(如果B没有事务,它们会用同一个事务。)(只要有一个回滚,整体就会回滚)
@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public void addUser(){
userDao.addUser();
testService.addTest();
}
@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public void addTest(){
testDao.addTest();
int i = 1/0;
}
REQUIRED表示在同一个事务: 1.addTest异常会使得整个事务回滚,user表和test表都没插入成功。 2.addUser异常也会使得事务回滚,user表和test表都没插入成功。
2.requires_new:如果当前有事务,其他不会加入当前事务,会新增事务。即他们的事务没有关系,不是同一个事务。
如果其他没有事务,那么以当前事务运行。
例如:方法A调用方法B,它们用不同的事务。(B不会用A的事务,会新增事务。)
@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public void addUser(){
userDao.addUser();
testService.addTest();
}

@Transactional(propagation = Propagation.REQUIRES_NEW,rollbackFor = Exception.class)
public void addTest(){
try {
testDao.addTest();
int i = 1/0;
} catch (Exception e){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}

REQUIRES_NEW表示addTest新创建了一个事务,跟addUser不在同一个事务里。两个事务互不影响。 1.addTest异常,进行回滚。addUser没有回滚。user表插入成功,test表插入失败。 2.addUser异常,进行回滚。addTest没有回滚。test表插入成功,user表插入失败。
3.supports:当前没有事务,就以非事务运行。当前有事务呢?就以当前事务运行。
例如:方法A调用方法B,如果A没有事务,那么B就以非事务运行。
如果A有事务就以A事务为准。如果A没有事务,那么B就会以非事务执行。

@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public void addUser(){
userDao.addUser();
testService.addTest();
int i = 1/0;
}


@Transactional(propagation = Propagation.SUPPORTS,rollbackFor = Exception.class)
public void addTest(){
try {
testDao.addTest();
} catch (Exception e){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}

如果addUser有事务,那么addTest跟addUser在同一个事务。如果addUser没有事务,那么就以非事务方式运行。
4.mandatory:其他没有事务就会抛异常。当前没有事务抛出异常,当前有事务则支持当前事务。
支持当前事务,如果当前没有事务就会抛出异常。
例如:方法A调用方法B,如果方法A没有事务,那么就会抛出异常。

@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public void addUser(){
userDao.addUser();
testService.addTest();
int i = 1/0;
}


@Transactional(propagation = Propagation.MANDATORY,rollbackFor = Exception.class)
public void addTest(){
try {
testDao.addTest();
} catch (Exception e){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}

如果addUser有事务,那么addTest跟addUser在同一个事务。如果addUser没有事务,那么就会报异常:No existing transaction found for transaction marked with propagation 'mandatory'
5.not_supported:以非事务执行。
例如:方法A调用方法B,方法B会挂起事务A以非事务方式执行。

@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public void addUser(){
userDao.addUser();
testService.addTest();
int i = 1/0;
}


@Transactional(propagation = Propagation.NOT_SUPPORTED,rollbackFor = Exception.class)
public void addTest(){
try {
testDao.addTest();
} catch (Exception e){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}

如果addUser异常,会回滚。addTest不会滚。不管addUser是否有事务,addTest都以非事务方式运行。
6.never:以非事务执行,如果存在事务,抛出异常。
总是以非事务执行,如果存在事务,那么就抛出异常。

@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public void addUser(){
userDao.addUser();
testService.addTest();
int i = 1/0;
}


@Transactional(propagation = Propagation.NEVER,rollbackFor = Exception.class)
public void addTest(){
try {
testDao.addTest();
} catch (Exception e){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}

如果addUser没有事务,addTest以非事务方式运行。如果addUser有事务,addTest就会报错:Existing transaction found for transaction marked with propagation 'never'
never和mandatory正好相反。
7.nested:如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。
如果当前事务不存在,那么其行为与Required一样。
例如:方法A中调用了方法B,B中try catch手动回滚,A不会回滚。
@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public void addUser(){
userDao.addUser();
testService.addTest();
}

@Transactional(propagation = Propagation.NESTED,rollbackFor = Exception.class)
public void addTest(){
try {
testDao.addTest();
int i = 1/0;
} catch (Exception e){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}

addUser的事务内嵌addTest的事务,如果addUser异常回滚,那么addTest也会回滚。如果addTest回滚,addUser不会回滚。
nested和requires_new的不同是:
nested内层事务回滚不影响外层,外层事务回滚影响内层跟着回滚。
requires_new外层和内层不是同一个事务,互不影响。外层回滚不影响内层,内层回滚不影响外层。
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev
两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio
我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。
假设您在Ruby中执行此操作:ar=[1,2]x,y=ar然后,x==1和y==2。是否有一种方法可以在我自己的类中定义,从而产生相同的效果?例如rb=AllYourCode.newx,y=rb到目前为止,对于这样的赋值,我所能做的就是使x==rb和y=nil。Python有这样一个特性:>>>classFoo:...def__iter__(self):...returniter([1,2])...>>>x,y=Foo()>>>x1>>>y2 最佳答案 是的。定义#to_ary。这将使您的对象被视为要分配的数组。irb>o=Obje
我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject