春サービスの研究ノート

序文

なぜスラグスラグ突然、この春のトランザクション分離レベルを学び、それを広めるだろうか?
この決定は明確なスラグスラグを前方に配置するよう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古い雌豚、次々に、ああハハ。
トランザクションの内部は、別のトランザクションが、あります。外大のトランザクションのロールバックトランザクションのロールバックは、大規模なトランザクションの実行には影響しません小さな、しかし小さなトランザクションのロールバックになります。

ルック読み取り専用の設定

ここに画像を挿入説明

公開された212元の記事 ウォン称賛30 ビュー190 000 +

おすすめ

転載: blog.csdn.net/weixin_38336658/article/details/103976888