miron102003
@miron102003
Просто люблю программирование.

Как заставить транзакции работать через CGLIB, чтобы я мог вызвать метод транзакции внутри класса?

Конфигурация:

<tx:annotation-driven transaction-manager="txManager" />
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   <!-- (this dependency is defined somewhere else) -->
   <property name="dataSource" ref="dataSource"/>
</bean>
	
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
	<property name="url" value="jdbc:mysql://localhost:3306/springjdbc?serverTimezone=UTC"/>
	<property name="username" value="root"/>
	<property name="password" value="1234"/>
</bean>


Класс:

@Component
public class SomeNumbersMySQLDao{
	public JdbcTemplate jdbcTemplate;
	
	@Autowired
	public SomeNumbersMySQLDao self;
	
	@Autowired
	public SomeNumbersMySQLDao(DataSource dataSource){
		jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
		SomeNumbersMySQLDao dao = context.getBean("someNumbersMySQLDao", SomeNumbersMySQLDao.class);
		
		dao.cleanTable();
		dao.outer(123);
		//dao.printTable();
	}
	
	@Transactional(propagation=Propagation.REQUIRED)
	public void outer(int number) {
		System.out.println(TransactionSynchronizationManager.isActualTransactionActive());
		jdbcTemplate.update("INSERT INTO someNumbers (number) VALUES (?)", new Object[] {number});
		self.withNever(number);
	}

	@Transactional(propagation=Propagation.NEVER)
	public void withNever(int numberToInsertInInnerMethod) {
		System.out.println(TransactionSynchronizationManager.isActualTransactionActive());
		jdbcTemplate.update("INSERT INTO someNumbers (number) VALUES (?)", new Object[] {numberToInsertInInnerMethod});
		jdbcTemplate.update("asdfghjkl;'qwertyuiop[]zxcvbnm,./");
	}
}


И это будет работать. Вывод:


true
Exception in thread "main" org.springframework.transaction.IllegalTransactionStateException: Existing transaction found for transaction marked with propagation 'never'


Однако мне надо, чтобы я мог вызывать не метод внедренного класса, а метод самого класса изнутри. То есть не self.withNever(number), а withNever(number). Что мне нужно добавить в файл конфигурации, чтобы я мог достичь этого
эффекта?
  • Вопрос задан
  • 88 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы