1

Мне нравится устанавливать Isolationlevel самостоятельно, используя оператор транзакций из Spring Framework в сочетании с myBatis. Я пытался много учебника, но ничего не получилось.Как установить уровень изоляции транзакции с помощью Spring с MyBatis

Мое приложение построено как шаблон MVC, это означает, что у меня есть виды, модели, интерфейсы, используемые для инъекции зависимости от mybatis и класса контроллера.

Я надеюсь, что кто-то может дать мне совет, я новичок в мифатисе и весне. Все приложение работает очень хорошо, но мне нравится брать контроль над изолированными уровнями.

This is the spring-configuration.xml file 
     <!--<mybatis-spring:scan base-package="de.hrw.model.**"/> --> 
    <mybatis-spring:scan base-package="de.hrw.*" /> 
    <context:component-scan base-package="de.hrw.*" /> 



    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"> 
     <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/carrental"> 
     </property> 
     <property name="username" value="root"></property> 
     <property name="password" value="root"></property> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 
     <property name="autoCommit" value="false"></property> 
     <property name="registerMbeans" value="true"></property> 
     <property name="transactionIsolation" 
      value="TRANSACTION_SERIALIZABLE"> 
     </property> 
    </bean> 


    <bean id="sqlSessionFactoryBean" 
     class="org.mybatis.spring.SqlSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource"></property> 
     <property name="configLocation" value="classpath:mybatis-config.xml"> 
     </property>  
    </bean> 

    <bean id="carController" class="de.hrw.controller.CarController"> 
     <property name="transactionManager" ref="transactionManager" /> 
    </bean> 

    <bean id="carSearchView" class="de.hrw.view.CarSearchView"> 
    </bean> 


    <bean id="transactionManager" 
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

Я использую инъекции зависимые пакеты из mybatis, чтобы получить данные из и в базу данных

пример iterface пакета de.hrw.mgmtDAO;

импорт java.util.List;

import de.hrw.model.CarModel; 


public interface ICarMgmt { 
    public CarModel selectCarById(final int carId);  
    public List<CarModel> selectAllCars(); 
} 

это основной класс, где я включать в себя вид (кадр)

public class Carrental_main { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

      ApplicationContext context = 
        new ClassPathXmlApplicationContext("spring-config.xml"); 

      CarController carController = (CarController) context.getBean("carController"); 

      carController.openSearchView(); 
      carController.getCarSearchView().setVisible(true); 
    }  

} 

это контроллер. Здесь я пытаюсь установить уровень изоляции для SERIALIZABLE но всегда устанавливается по умолчанию (-1)

@Transactional(propagation=Propagation.REQUIRES_NEW , isolation = Isolation.SERIALIZABLE) 
public class CarController { 
    @Autowired 
    private ICarMgmt carMgmt; 

private CarSearchView carSearchView; 

private ApplicationContext applicationContext; 
@Autowired 
private PlatformTransactionManager transactionManager; 

private TransactionStatus transactionStatus; 

private TransactionDefinition defaultTransactionDefinition; 

private DataSource dataSource; 


public void openSearchView() { 
    this.setApplicationContext(); 
    this.setDefaultTransactionDefinition(); 
    this.setTransactionStatus(); 

    this.carSearchView = (CarSearchView) applicationContext 
      .getBean("carSearchView"); 


    try { 

     List<CarModel> carList = carMgmt.selectAllCars(); 


     // this.carSearchView.setResultList(carList); 
     this.carSearchView.setLabelList(carList); 


     this.carSearchView.createTextFieldList(); 
     this.carSearchView.createLabelFieldList(); 


     transactionManager.commit(transactionStatus); 

    } catch (DataAccessException e) { 
     System.out.println("Error in creating record, rolling back"); 
     transactionManager.rollback(transactionStatus); 
     throw e; 
    } 
} 

public void setDataSource(DataSource dataSource) { 
      this.dataSource = dataSource; 

     } 

public void setDefaultTransactionDefinition() { 
    this.defaultTransactionDefinition = new DefaultTransactionDefinition(); 
} 

public void setApplicationContext() { 
    applicationContext = new ClassPathXmlApplicationContext(
      "spring-config.xml"); 
} 

public void setTransactionManager(
     PlatformTransactionManager transactionManager) { 
    this.transactionManager = transactionManager; 
} 

public void setTransactionStatus() { 
    this.transactionStatus = transactionManager.getTransaction(defaultTransactionDefinition); 

} 
+0

Это выглядит правильно. Но вы уверены, что вам нужна SERIALIZABLE? Похоже, вам нужно хотя бы InnoDB 5.5, чтобы получить поддержку для этого - http://stackoverflow.com/questions/6269471/does-mysql-innodb-implement-true-serializable-isolation – AngerClown

+0

Serializable предназначен для тестирования. Я хочу получить Terror, если я вставляю в один и тот же объект подряд. Но он не работает. В beangraph я видел, что SessionBeanFactory и txManager не связаны. Макс есть проблема. Но я не знаю, как их подключить. – Sigurius

+0

Какая версия весны вы используете? А также версия mybatis? –

ответ

0

Я наконец нашел решение. Я изменил объект TransactionDefinition в контроллере DefaultTransactionDefinition объекта

private DefaultTransactionDefinition defaultTransactionDefinition; 

бывшего это

private TransactionDefinition defaultTransactionDefinition; 

но TransactionDefinition не предусматривает каких-либо методов настройки. Мне было интересно, потому что в документации я нашел такие методы для установки уровня изоляции, но эти методы просто предоставляются DefaultTransactionDefinition. После того, как я обнаружил эту ошибку я добавил следующие строки кодов и, наконец, работает

defaultTransactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); 
defaultTransactionDefinition.setIsolationLevel(DefaultTransactionDefinition.ISOLATION_REPEATABLE_READ); 

Thx для всех ваших советует. Если кто-то знает действительно хороший учебник для MyBatis + Spring и менеджера транзакций, пожалуйста, отправьте ссылку: D

0

Вы можете применить транзакцию, как показано ниже в интерфейсе картографа (хотя рекомендуется применять аннотацию транзакций для класса, однако в mybatis транзакция, определенная в интерфейсе, будет применена к прокси-классу)

import java.util.List; 
import de.hrw.model.CarModel; 

@Transactional 
public interface ICarMgmt { 

    @Transactional(isolation = Isolation.SERIALIZABLE) 
    public CarModel selectCarById(final int carId); 

    public List<CarModel> selectAllCars(); 
} 
Смежные вопросы