`
Donald_Draper
  • 浏览: 984950 次
社区版块
存档分类
最新评论

DefaultSqlSession第三讲-事务提交,回滚,关闭SqlSession,清除缓存

阅读更多
上面两篇讲过query和update及flushStatements,这篇我们讲一下commit,rollback,clearCache,close
public class DefaultSqlSession
    implements SqlSession
{
    private Configuration configuration;
    private Executor executor;
    private boolean dirty;
    public DefaultSqlSession(Configuration configuration, Executor executor)
    {
        this.configuration = configuration;
        this.executor = executor;
        dirty = false;
    }
    //查询
    public Object selectOne(String statement)
    {
        return selectOne(statement, null);
    }
    public Object selectOne(String statement, Object parameter)
    {
        List list = selectList(statement, parameter);
        if(list.size() == 1)
            return list.get(0);
        if(list.size() > 1)
            throw new TooManyResultsException((new StringBuilder()).append("Expected one result (or null) to be returned by selectOne(), but found: ").append(list.size()).toString());
        else
            return null;
    }
    public List selectList(String statement)
    {
        return selectList(statement, null);
    }

    public List selectList(String statement, Object parameter)
    {
        return selectList(statement, parameter, RowBounds.DEFAULT);
    }
    public List selectList(String statement, Object parameter, RowBounds rowBounds)
    {
        List list;
        try
        {
            org.apache.ibatis.mapping.MappedStatement ms = configuration.getMappedStatement(statement);
	    //调用executor的查询方法
            List result = executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
            list = result;
        }
    }
    //插入
     public int insert(String statement)
    {
        return insert(statement, null);
    }

    public int insert(String statement, Object parameter)
    {
       //委托给update方法
        return update(statement, parameter);
    }

    public int update(String statement)
    {
        return update(statement, null);
    }

    public int update(String statement, Object parameter)
    {
        int i;
        try
        {
            dirty = true;
            org.apache.ibatis.mapping.MappedStatement ms = configuration.getMappedStatement(statement);
            //委托给executor的update
	    i = executor.update(ms, wrapCollection(parameter));
        }
    }
    //删除
     public int delete(String statement)
    { 
        //委托给update
        return update(statement, null);
    }

    public int delete(String statement, Object parameter)
    {
        return update(statement, parameter);
    }
    //提交
     public void commit()
    {
        commit(false);
    }

    public void commit(boolean force)
    {
        try
        {
	    //委托executor的commit
            executor.commit(isCommitOrRollbackRequired(force));
            dirty = false;
        }
    }
    //回滚
     public void rollback()
    {
        rollback(false);
    }

    public void rollback(boolean force)
    {
        try
        {
	    //委托executor的rollback
            executor.rollback(isCommitOrRollbackRequired(force));
            dirty = false;
        }
    }
    //清除缓存
    public void clearCache()
    {
	////委托executor的clearLocalCache
        executor.clearLocalCache();
    }
    //刷新Statements
    public List flushStatements()
    {
        List list;
        try
        {
	    //委托executor的flushStatements
            list = executor.flushStatements();
        }
    }
    //关闭SqlSession
    public void close()
    {
        //委托executor的close
        executor.close(isCommitOrRollbackRequired(false));
        dirty = false;
    }
}

DefaultSqlSession的commit,rollback,clearCache,close方法,实际是调用
Executor的方法,所有这些方法在BaseExecutor中
public abstract class BaseExecutor
    implements Executor
{
    private static final Log log = LogFactory.getLog(org/apache/ibatis/executor/BaseExecutor);
    protected Transaction transaction;
    protected ConcurrentLinkedQueue deferredLoads;
    protected PerpetualCache localCache;
    protected PerpetualCache localOutputParameterCache;
    protected Configuration configuration;
    protected int queryStack;
    private boolean closed;
    //提交事务
     public void commit(boolean required)
        throws SQLException
    {
        if(closed)
            throw new ExecutorException("Cannot commit, transaction is already closed");
        clearLocalCache();
        flushStatements();
        if(required)
            transaction.commit();
    }
    //回滚事务
    public void rollback(boolean required)
        throws SQLException
    {
        if(closed)
            break MISSING_BLOCK_LABEL_49;
        clearLocalCache();
        flushStatements(true);
        if(required)
            transaction.rollback();
        break MISSING_BLOCK_LABEL_49;
        Exception exception;
        exception;
        if(required)
            transaction.rollback();
        throw exception;
    }
    //清除本地缓存
    public void clearLocalCache()
    {
        if(!closed)
        {
            localCache.clear();
            localOutputParameterCache.clear();
        }
    }
    //关闭statement
    protected void closeStatement(Statement statement)
    {
        if(statement != null)
            try
            {
                statement.close();
            }
            catch(SQLException e) { }
    }
}

从上面可以看出事务的提交与回滚实际上所以依赖于transaction,再来看JdbcTransaction
//JdbcTransaction
public class JdbcTransaction
    implements Transaction
{
    protected Connection connection;//数据库连接
    protected DataSource dataSource;//数据源
    protected TransactionIsolationLevel level;//事务级别
    protected boolean autoCommmit;
    public JdbcTransaction(DataSource ds, TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit)
    {
        dataSource = ds;
        level = desiredLevel;
        autoCommmit = desiredAutoCommit;
    }
   //获取Connection
  public Connection getConnection()
        throws SQLException
    {
        if(connection == null)
            openConnection();
        return connection;
    }
    //打开Connection
    protected void openConnection()
        throws SQLException
    {
        if(log.isDebugEnabled())
            log.debug("Openning JDBC Connection");
        connection = dataSource.getConnection();
        if(level != null)
	     //设置连接事务级别
            connection.setTransactionIsolation(level.getLevel());
        setDesiredAutoCommit(autoCommmit);
    }
    //提交事务
    public void commit()
        throws SQLException
    {
        if(connection != null && !connection.getAutoCommit())
        {
            if(log.isDebugEnabled())
                log.debug((new StringBuilder()).append("Committing JDBC Connection [").append(connection).append("]").toString());
            connection.commit();
        }
    }
    //回滚事务
    public void rollback()
        throws SQLException
    {
        if(connection != null && !connection.getAutoCommit())
        {
            if(log.isDebugEnabled())
                log.debug((new StringBuilder()).append("Rolling back JDBC Connection [").append(connection).append("]").toString());
            connection.rollback();
        }
    }
    //关闭事务
    public void close()
        throws SQLException
    {
        if(connection != null)
        {
            resetAutoCommit();
            if(log.isDebugEnabled())
                log.debug((new StringBuilder()).append("Closing JDBC Connection [").append(connection).append("]").toString());
            connection.close();
        }
    }    
}

从上面可看出JdbcTransaction,依赖于具体的数据库。
总结:
事务的提交与回滚实际上所以依赖于transaction,transaction依赖于具体的数据库;清除缓存就是清空执行器的本地缓存;关闭SqlSession实际上是,通过执行器关闭statement。
分享到:
评论

相关推荐

    spring-控制事物回滚

    编程式事务管理通过`PlatformTransactionManager`接口和`TransactionDefinition`接口来实现,它需要在代码中显式调用开始事务、提交事务、回滚事务等方法。这种方式灵活但侵入性强,不推荐在大型项目中使用。 声明...

    Spring+Mybatis整合事务回滚

    花了一晚上时间终于搞出来了Spring整合Mybatis事务回滚(Mysql数据库),控制Service层中的多次插入操作,多次操作整体是一个事务。 里面有缘嘛和jar包,资源为war包,导入即可。运行Test类中的测试代码即可。 建表...

    SQL 事务回滚解决 回滚无效的情况

    SQL 事务回滚解决回滚无效的情况 BEGIN TRY END TRY CAHTH

    流程框架snaker,用于 提交-审核-撤销-回滚

    3. **任务提交与审批**:在提交环节,Snaker提供API或集成到业务系统中,使用户可以方便地发起流程实例。审批环节则支持自定义审批策略,例如基于角色、人员或条件的审批,确保流程的公正性和合规性。 4. **撤销与...

    简单的c#事务回滚实例代码

    在.NET框架中,C#语言提供了对事务处理的强大支持,特别是在数据库操作中,事务回滚是确保数据一致性的重要机制。本实例将详细讲解如何在C#中实现简单的事务回滚功能,以应对在执行多条SQL语句时可能出现的错误。 ...

    Python Flask高级编程之从0到1开发鱼书-模型(数据库事务、重写Flask-事务与回滚.mp4

    Python Flask高级编程之从0到1开发鱼书-模型(数据库事务、重写Flask-事务与回滚.mp4

    JAVA设置手动提交事务,回滚事务,提交事务的操作

    JAVA设置手动提交事务、回滚事务、提交事务的操作详解 本文主要介绍了JAVA设置手动提交事务、回滚事务、提交事务的操作,涉及到事务的自动提交、手动提交、回滚和提交等操作。以下是对这些操作的详细解释和示例代码...

    嵌套事务的回滚与提交.pdf

    举例来说,如果开始一个事务,然后开始第二个事务,再开始第三个事务,每次`BEGIN TRAN`都会使`@@TRANCOUNT`增加1。在每个`COMMIT TRAN`之后,`@@TRANCOUNT`减1,直到最后恢复到0,表示所有事务都已处理完毕。在测试...

    git 删除分支和回滚的实例详解

    git 删除分支和回滚的实例详解 【git 删除本地分支】 ...git reset --hard HEAD~3:将最近3次的提交回滚 【远程代码库回滚】: 这个是重点要说的内容,过程比本地回滚要复杂 应用场景:自动部署系统发布后发现问题

    子线程任务发生异常,主线程事务如何回滚

    子线程任务发生异常,主线程事务如何回滚? 本文将详细探讨当子线程任务发生异常时,如何让主线程捕获到该异常并进行事务的回滚。下面将从多线程编程的基础知识、线程池的使用、异常捕获三个方面进行阐述。 一、多...

    关于SpringMyBatis纯注解事务不能提交的问题分析与解决

    这表明事务提交的行为与使用的数据库类型有关联,需要对现有的配置和代码进行深入分析来定位问题原因并找到解决方案。 #### 原有配置分析 原有的配置如下: ```xml ...

    spring 简单实例 事务回滚

    这会告诉Spring在调用此方法时启动一个新的事务,并在方法正常结束时提交事务,或者在遇到异常时回滚事务。 4. 异常处理:为了触发事务回滚,方法内通常会抛出未检查异常(继承自`RuntimeException`的异常)或显式...

    动力节点MySQL数据库入门视频教程-106-怎么提交和回滚事务

    动力节点的杜老师讲述的mysql教程,详细讲解了MySQL的相关知识,包括MySQL概述,MySQL应用环境,MySQL系统特性,MySQL初学基础,MySQL管理工具,如何安装MySQL及MySQL新特性,通过观看可掌握MySQL全套知识。

    tencentyun#qcloud-documents#回滚服务1

    1. 接口描述 2. 输入参数 3. 输出参数 4. 示例

    Spring/SpringMVC/MyBatis整合+事务回滚

    配置事务管理器后,可以通过@Transactional注解在方法级别控制事务的开始、提交或回滚。 7. **实现事务回滚**:当在@Transactional注解的方法中发生异常时,Spring会自动回滚事务。例如,如果在保存数据时发生错误...

    ACI--创建-配置-回滚:Cisco ACI自动化脚本

    产品作为任何脚本的第一步,请创建回滚并引用更改记录号。 CAB会爱你的。安装克隆到您的计算机,更新certificate.py,运行APICSnapshot.py。组态进入该凭据文件。并将您的详细信息添加到主机,用户名和密码对象。 ...

    数据库试验,关于事务的创建撤销,事务的回滚等基本操作练习

    持续性意味着一旦事务提交,其对数据库的影响将是永久的,即使系统崩溃也能恢复。 SQL Server 提供两种类型的事务:系统事务和用户定义的事务。系统事务通常由特定的SQL语句(如ALTER TABLE、CREATE、DELETE等)...

    oracle 事务 回滚 存储过程

    在Oracle数据库环境中,事务管理与存储过程的结合是实现数据一致性、事务回滚以及错误处理的关键技术之一。本文将深入探讨“Oracle事务回滚存储过程”这一主题,旨在理解其核心概念、工作原理以及实际应用。 ### ...

Global site tag (gtag.js) - Google Analytics