spring问题架构我爱编程

Spring事务6(Spring事务常见问题)

2017-06-02  本文已影响330人  老猫头

1.Jdbc访问数据库###

public class UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;

     public int insertUser(User user){
        String sqlStr = "insert into t_user (user_name,password,credits)values(?,?,?)";
        return jdbcTemplate.update(sqlStr,new Object[]{user.getUserName()
        ,user.getPassword(),user.getCredits()});
    }
}

在默认情况下,dataSource数据源的autoCommit被设置为true,这也意味着所有通过jdbcTemplate执行的语句马上提交,没有事务。所以不使用Spring事务也可以进行数据库操作。

配置Spring事务的时候首先要确定数据库支持Spring事务,如果使用MyISAM引擎的MySQL数据库,这时即使配置了,也没有实际价值。

2.Hibernate访问数据库###

Hibernate的事务管理有其自身的意义,它和Hibernate一级缓存存在密切的关系,当调用Session的save、update等方法时,Hibernate并不直接向数据库发送SQL语句,只在提交事务或flush一级缓存时才真正向数据库发送SQL。

因此,数据库不支持事务,Hibernate的事务管理也有一定的好处,不会对数据库的操作产生负面的影响。如果使用Hibernate的数据访问技术,没有理由不配置HibernateTransactionManager.

3.应用分层###

Spring框架所提供的各种好处(如AOP、注解增强、注解MVC)的唯一前提就是让POJO的类变为一个受Spring容器管理的Bean,除此之外没有其他任何要求。因此一个类可以同时是Contorller,也可以注解为Service,也可以注解为Dao.

4.事务方法嵌套调用###

5.多线程事务问题###

6.Spring应对混合框架的事务管理###

7.不能实施Spring事务的方法###

8.数据连接泄露问题###

    public static Connection doGetConnection(DataSource dataSource) throws SQLException {
    Assert.notNull(dataSource, "No DataSource specified");

    ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
    if (conHolder != null && (conHolder.hasConnection() || conHolder.isSynchronizedWithTransaction())) {
        conHolder.requested();
        if (!conHolder.hasConnection()) {
            logger.debug("Fetching resumed JDBC Connection from DataSource");
            conHolder.setConnection(dataSource.getConnection());
        }
        return conHolder.getConnection();
    }
    // Else we either got no holder or an empty thread-bound holder here.

    logger.debug("Fetching JDBC Connection from DataSource");
    Connection con = dataSource.getConnection();

    if (TransactionSynchronizationManager.isSynchronizationActive()) {
        logger.debug("Registering transaction synchronization for JDBC Connection");
        // Use same Connection for further JDBC actions within the transaction.
        // Thread-bound object will get removed by synchronization at transaction completion.
        ConnectionHolder holderToUse = conHolder;
        if (holderToUse == null) {
            holderToUse = new ConnectionHolder(con);
        }
        else {
            holderToUse.setConnection(con);
        }
        holderToUse.requested();
        TransactionSynchronizationManager.registerSynchronization(
                new ConnectionSynchronization(holderToUse, dataSource));
        holderToUse.setSynchronizedWithTransaction(true);
        if (holderToUse != conHolder) {
            TransactionSynchronizationManager.bindResource(dataSource, holderToUse);
        }
    }

    return con;
}
上一篇 下一篇

猜你喜欢

热点阅读