記事のディレクトリ
序文
なぜスラグスラグ突然、この春のトランザクション分離レベルを学び、それを広めるだろうか?
この決定は明確なスラグスラグを前方に配置するようTucaoは、古いデータへの更新クエリの後、昨日、同僚が言いました。
シーン
( - > update->チェックチェック)だけでなく、xxはその後、私は*保存、それを試してみました(チェック - > update->チェック)。
結果
当社のデータベースには、RCレベルです
最初のケース:古いデータで見つかったが、Navicatは後にデータベースの更新が表示されないデータの更新を、クエリデータが古いました
第2の状況:古いデータで見つかった、更新されたデータベース後のNavicat 参照するには、データの更新は、クエリデータは古い(だけでなく、キャッシュヒット)で見つかりました
これは、更新がコミットされていない最初のケースです。
原因
あなたのコードを表示
@Getter
@Setter
@Configuration
public class TransactionConfiguration {
private static final String CUSTOM_PLATFORM_TRANSACTION_MANAGER_NAME = "platformTransactionManager";
private static final String CUSTOM_TRANSACTION_INTERCEPTOR_NAME = "customTransactionInterceptor";
private static final String CUSTOM_BEAN_NAME_AUTO_PROXY_CREATOR_NAME = "beanNameAutoProxyCreator";
/**
* 默认的只读事务
*/
private static final String[] DEFAULT_READ_ONLY_METHOD_RULE_TRANSACTION_ATTRIBUTES = { "get*", "count*", "find*",
"query*", "select*", "list*", "*", };
/**
* 默认只对 "*Service" , "*ServiceImpl" Bean 进行事务处理,"*"表示模糊匹配, 比如 :
* userService,orderServiceImpl
*/
private static final String[] DEFAULT_TRANSACTION_BEAN_NAMES = { "*Service", "*ServiceImpl" };
/**
* 可传播事务配置
*/
private static final String[] DEFAULT_REQUIRED_METHOD_RULE_TRANSACTION_ATTRIBUTES = { "add*", "save*", "insert*",
"delete*", "update*", "edit*", "batch*", "create*", "remove*", };
/**
* 自定义事务 BeanName 拦截
*/
private String[] customTransactionBeanNames = {};
/**
* 自定义方法名的事务属性相关联,可以使用通配符(*)字符关联相同的事务属性的设置方法; 只读事务
*/
private String[] customReadOnlyMethodRuleTransactionAttributes = {};
/**
* 自定义方法名的事务属性相关联,可以使用通配符(*)字符关联相同的事务属性的设置方法; 传播事务(默认的)
* {@link org.springframework.transaction.annotation.Propagation#REQUIRED}
*/
private String[] customRequiredMethodRuleTransactionAttributes = {};
@Autowired
@Qualifier(value="druidDataSource")
private DataSource dataSource;
@Bean(name = CUSTOM_PLATFORM_TRANSACTION_MANAGER_NAME)
public PlatformTransactionManager platformTransactionManager() {
return new DataSourceTransactionManager(this.dataSource);
}
/**
* 配置事务拦截器,注意:transactionInterceptor 名称的 bean 可能已经存在,导致该生成 bean
* 的方法不能执行,所以定义成另外一个名字
*
* @param platformTransactionManager
* 事务管理器
* @return
*/
@Bean(name = CUSTOM_TRANSACTION_INTERCEPTOR_NAME)
public TransactionInterceptor customTransactionInterceptor(
@Qualifier(CUSTOM_PLATFORM_TRANSACTION_MANAGER_NAME) PlatformTransactionManager platformTransactionManager) {
NameMatchTransactionAttributeSource transactionAttributeSource = new NameMatchTransactionAttributeSource();
RuleBasedTransactionAttribute readOnly = this.readOnlyTransactionRule();
RuleBasedTransactionAttribute required = this.requiredTransactionRule();
// 默认的只读事务配置
for (String methodName : DEFAULT_READ_ONLY_METHOD_RULE_TRANSACTION_ATTRIBUTES) {
transactionAttributeSource.addTransactionalMethod(methodName, readOnly);
}
// 定制的只读事务配置
for (String methodName : customReadOnlyMethodRuleTransactionAttributes) {
transactionAttributeSource.addTransactionalMethod(methodName, readOnly);
}
// 默认的传播事务配置
for (String methodName : DEFAULT_REQUIRED_METHOD_RULE_TRANSACTION_ATTRIBUTES) {
transactionAttributeSource.addTransactionalMethod(methodName, required);
}
// 定制的传播事务配置
for (String methodName : customRequiredMethodRuleTransactionAttributes) {
transactionAttributeSource.addTransactionalMethod(methodName, required);
}
return new TransactionInterceptor(platformTransactionManager, transactionAttributeSource);
}
/**
* 当前存在事务就使用当前事务,当前不存在事务就创建一个新的事务
* {@link org.springframework.transaction.annotation.Propagation#REQUIRED}
*/
private RuleBasedTransactionAttribute requiredTransactionRule() {
RuleBasedTransactionAttribute required = new RuleBasedTransactionAttribute();
required.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
required.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
required.setTimeout(TransactionDefinition.TIMEOUT_DEFAULT);
return required;
}
/**
* 只读事务
* {@link org.springframework.transaction.annotation.Propagation#NOT_SUPPORTED}
*/
private RuleBasedTransactionAttribute readOnlyTransactionRule() {
RuleBasedTransactionAttribute readOnly = new RuleBasedTransactionAttribute();
readOnly.setReadOnly(true);
readOnly.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);
return readOnly;
}
/**
* 配置事务拦截
* <p>
* {@link #customTransactionInterceptor(PlatformTransactionManager)}
*/
@Bean(name = CUSTOM_BEAN_NAME_AUTO_PROXY_CREATOR_NAME)
public BeanNameAutoProxyCreator customTransactionBeanNameAutoProxyCreator() {
BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator();
// 设置定制的事务拦截器
beanNameAutoProxyCreator.setInterceptorNames(CUSTOM_TRANSACTION_INTERCEPTOR_NAME);
// 默认 + 定制
String[] unions = ArrayUtils.addAll(DEFAULT_TRANSACTION_BEAN_NAMES, customTransactionBeanNames);
beanNameAutoProxyCreator.setBeanNames(unions);
beanNameAutoProxyCreator.setProxyTargetClass(true);
return beanNameAutoProxyCreator;
}
}
あなたは非脳のタイプ、CCの使用をコピーした後、インターネット上のこの1は〜、あること、検索することが容易に可能です
分析
その上のコード、取引のXML構成のようなビットを調理。一致して、トランザクションを追加するためのメソッド名です。
これが事実であることの理由は、その後に起因する前にこれらの2例を見てください。
理由は最初のケース
保存デフォルトのトランザクションを開くために、次に取得時間を、トランザクションが保留中。更新と、元のトランザクションを復元取得提出し、その後、とハングアップ。
理由は二ケース
一般的なアプローチは、トランザクションを開き、取得しないことです通常の実行を、更新業務を開始し、取得、更新中断するつもりはない、ここでトランザクションを、トランザクションがサブ、今回、アップデートとみなすべき取引に提出します。取得ヒットキャッシュを、古いデータで見つかりました。
春のトランザクション伝播と分離レベルの学習
公式サイトから行くspring.io
春のトランザクションレベル
列挙型の伝播
PROPAGATION_REQUIRED
デフォルトの分離レベル
のトランザクションは、現在のトランザクションに現在ある場合。ない場合は、作成します。
注意事項
ときに、内部機能のロールバックの問題は、一緒にロールバック外側の関数になります。
PROPAGATION_REQUIRES_NEW
常に新しいトランザクション。
注意点
お互いに、トランザクションのロールバックに影響を与えないでください。
PROPAGATION_NESTED
トランザクションのネスト。
Daitao古い雌豚、次々に、ああハハ。
トランザクションの内部は、別のトランザクションが、あります。外大のトランザクションのロールバックトランザクションのロールバックは、大規模なトランザクションの実行には影響しません小さな、しかし小さなトランザクションのロールバックになります。