001: /*
002: * Copyright 2002-2006 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.transaction.annotation;
018:
019: import java.lang.annotation.Documented;
020: import java.lang.annotation.ElementType;
021: import java.lang.annotation.Inherited;
022: import java.lang.annotation.Retention;
023: import java.lang.annotation.RetentionPolicy;
024: import java.lang.annotation.Target;
025:
026: import org.springframework.transaction.TransactionDefinition;
027:
028: /**
029: * Describes transaction attributes on a method or class.
030: *
031: * <p>This annotation type is generally directly comparable to Spring's
032: * {@link org.springframework.transaction.interceptor.RuleBasedTransactionAttribute}
033: * class, and in fact {@link AnnotationTransactionAttributeSource} will directly
034: * convert the data to the latter class, so that Spring's transaction support code
035: * does not have to know about annotations. If no rules are relevant to the exception,
036: * it will be treated like
037: * {@link org.springframework.transaction.interceptor.DefaultTransactionAttribute}
038: * (rolling back on runtime exceptions).
039: *
040: * @author Colin Sampaleanu
041: * @author Juergen Hoeller
042: * @since 1.2
043: * @see org.springframework.transaction.interceptor.DefaultTransactionAttribute
044: * @see org.springframework.transaction.interceptor.RuleBasedTransactionAttribute
045: */
046: @Target({ElementType.METHOD,ElementType.TYPE})
047: @Retention(RetentionPolicy.RUNTIME)
048: @Inherited
049: @Documented
050: public @interface Transactional {
051:
052: /**
053: * The transaction propagation type.
054: * <p>Defaults to {@link Propagation#REQUIRED}.
055: */
056: Propagation propagation() default Propagation.REQUIRED;
057:
058: /**
059: * The transaction isolation level.
060: * <p>Defaults to {@link Isolation#DEFAULT}.
061: */
062: Isolation isolation() default Isolation.DEFAULT;
063:
064: /**
065: * The timeout for this transaction.
066: * <p>Defaults to the default timeout of the underlying transaction system.
067: */
068: int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
069:
070: /**
071: * <code>true</code> if the transaction is read-only.
072: * <p>Defaults to <code>false</code>.
073: */
074: boolean readOnly() default false;
075:
076: /**
077: * Defines zero (0) or more exception {@link Class classes}, which must be a
078: * subclass of {@link Throwable}, indicating which exception types must cause
079: * a transaction rollback.
080: * <p>This is the preferred way to construct a rollback rule, matching the
081: * exception class and subclasses.
082: * <p>Similar to {@link org.springframework.transaction.interceptor.RollbackRuleAttribute#RollbackRuleAttribute(Class clazz)}
083: */
084: Class<? extends Throwable>[] rollbackFor() default {};
085:
086: /**
087: * Defines zero (0) or more exception names (for exceptions which must be a
088: * subclass of {@link Throwable}), indicating which exception types must cause
089: * a transaction rollback.
090: * <p>This can be a substring, with no wildcard support at present.
091: * A value of "ServletException" would match
092: * {@link javax.servlet.ServletException} and subclasses, for example.
093: * <p><b>NB: </b>Consider carefully how specific the pattern is, and whether
094: * to include package information (which isn't mandatory). For example,
095: * "Exception" will match nearly anything, and will probably hide other rules.
096: * "java.lang.Exception" would be correct if "Exception" was meant to define
097: * a rule for all checked exceptions. With more unusual {@link Exception}
098: * names such as "BaseBusinessException" there is no need to use a FQN.
099: * <p>Similar to {@link org.springframework.transaction.interceptor.RollbackRuleAttribute#RollbackRuleAttribute(String exceptionName)}
100: */
101: String[] rollbackForClassName() default {};
102:
103: /**
104: * Defines zero (0) or more exception {@link Class Classes}, which must be a
105: * subclass of {@link Throwable}, indicating which exception types must <b>not</b>
106: * cause a transaction rollback.
107: * <p>This is the preferred way to construct a rollback rule, matching the
108: * exception class and subclasses.
109: * <p>Similar to {@link org.springframework.transaction.interceptor.NoRollbackRuleAttribute#NoRollbackRuleAttribute(Class clazz)}
110: */
111: Class<? extends Throwable>[] noRollbackFor() default {};
112:
113: /**
114: * Defines zero (0) or more exception names (for exceptions which must be a
115: * subclass of {@link Throwable}) indicating which exception types must <b>not</b>
116: * cause a transaction rollback.
117: * <p>See the description of {@link #rollbackForClassName()} for more info on how
118: * the specified names are treated.
119: * <p>Similar to {@link org.springframework.transaction.interceptor.NoRollbackRuleAttribute#NoRollbackRuleAttribute(String exceptionName)}
120: */
121: String[] noRollbackForClassName() default {};
122:
123: }
|