mybatis 多个sql的事务管理怎么写

mybatis 多个sql的事务管理怎么写,第1张

我是用的spring集成的

1可以用aop,切面控制事务

2可以用注解控制事务(申明式事务)

3编程式事务

jdbcxml

<xml version="10" encoding="UTF-8">

<beans xmlns=";

java代码:

申明式事务,关键字@Transactional

@Transactional

public int Save1(String name, String hometown) {

    Person person = new Person();

    personsetName(name);

    personsetHometown(hometown);

    int i = personDaoinset(person);

    Systemoutprintln("id,getId:" + persongetId());

    Systemoutprintln("result:" + i);

    Systemoutprintln("person:" + persontoString());

    User user = new User();

    

    usersetNickName(name);

    usersetLoginName(name);

    userDaosave(user);

    return 1;

}

编程式事务:

 public int hello2(String name, String hometown) {

        //编程式事务

//        TransactionStatus status = thisgetTransactionManager()getTransaction(thisgetTxDefinition());

        //手动提交

//        getTransactionManager()commit(status);

        //手动回滚

        //getTransactionManager()rollback(status);

        TransactionStatus status = thisgetTransactionManager()getTransaction(thisgetTxDefinition());

        try {

            Person person = new Person();

            personsetName(name);

            personsetHometown(hometown);

            int i = personDaoinset(person);

            Systemoutprintln("id,getId:" + persongetId());

            Systemoutprintln("result:" + i);

            Systemoutprintln("person:" + persontoString());

            User user = new User();

            usersetId(46);

            usersetNickName(name);

            usersetLoginName(name);

            userDaosave(user);

            getTransactionManager()commit(status);

        } catch (Exception e) {

            eprintStackTrace();

            getTransactionManager()rollback(status);

        }

        return 1;

    }

pefb

连接池:用于存储连接的一个容器,容器其实就是一个集合对象,该集合必须是线程安全的,不能两个线程拿到同一连接,该集合还必须实现队列的特性:先进先出首先创建很多连接,使用时直接取出。线程使用完连接,连接重新回到连接池可以减少获取连接所消耗的时间。

首先明确一点 cache-ref 只对二级缓存有效,没有使用二级缓存时,这东西没有意义。

以下说明只针对二级缓存。

当mybatis的当前命名空间存在DML的事务提交时,会使当前命名空间里的缓存失效,这样在查询时,会直接从数据库拿到数据,并再次缓存。但是如果是多表连接查询,如tableA join tableB,A表的DML *** 作在A的nameSpace,B表的DML *** 作在B的nameSpace,当B表在进行了数据修改时,不会使A表缓存失效,再使用tableA join tableB会直接从缓存中获取数据,因为此时缓存没有刷新,而且B表的数据也有变化,那么此时读取的就是脏数据。

此时就需要在B的nameSpace里使用<cache-ref namespace="A"/>,保证跟新B时,A的缓存也失效。再在A里面执行 tableA join tableB时,会重新从数据库里查询最新数据。

因为mybatis把事务抽象到了TransactionManager中,而事务默认开启,所以我们只需要使用sqlSessioncommit()和rollback()方法,因为在sqlSession中,实际上调用的是transactionManager来完成的具体的事务提交和回滚 *** 作。

而你说hibernate的beginTransaction,其实这个方法不是开启事务,因为hibernate默认事务也是开启的,但是hibernate有事务状态这个概念,beginTransaction方法仅仅是把session关联的事务置为活动状态而已,并不是真正开启一个事务。

1,首先在包下创建Configurationxml文件,该文件的格式如下:

< xml version="10" encoding="UTF-8" > <!DOCTYPE configuration PUBLIC "-//mybatisorg//DTD Config 30//EN" ""> <configuration> <environments default="dev"> <environment id="dev"> <transactionManager type="JDBC"$amp;>amp;$lt;/transactionManager> <dataSource type="POOLED"> <property name="driver" value="oraclejdbcdriverOracleDriver" /> <property name="url" value="jdbc:oracle:thin:@192168120:1521:oa" /> <property name="username" value="zhangsan" /> <property name="password" value="123" /> </dataSource> </environment> </environments> <mappers> <mapper resource="com/cissst/oa/data/UserMapperxml" /> <mapper resource="com/cissst/oa/data/DepartmentMapperxml" /> </mappers> </configuration>

2,使用myBatis提供的工具类中的方法,从类路径或Configurationxml文档所在位置加载资源文件。

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

SqlSessionFactory factory = null;

// 获取SqlSessionFactory对象

try {

Reader reader = Resources

getResourceAsReader("com/cissst/oa/data/Configurationxml");

factory = builderbuild(reader);

} catch (Exception e) {

eprintStackTrace();

}

3,使用工厂对象获取SqlSession 对象

SqlSession session=factory openSession(false);

参数如果为true,表示该会话具有自动提交事务的功能,否则需程序员手动提交事务。

4,使用进行数据库访问

SqlSession session = supergetSqlSession();

// 构造返回值集合

List<UserEntity> result = new ArrayList<UserEntity>();

try {

// 获取映射接口

UserMapper userMapper = sessiongetMapper(UserMapperclass);

// 调用接口中的方法

List<UserEntity> list = userMappergetUserList(userEntity);

// 提交事务

sessioncommit();

} catch (Exception e) {

// 回滚事务

sessionrollback();

} finally {

// 关闭会话

sessionclose();

}

需要进行排他处理,数据库里需要一个最后更新时间的字段,每次更新的时候更新该字段

修改 *** 作的时候,需要拿到这条数据的最后更新时间,hidden在画面中,提交的时候,这个最后更新时间再去后台比较,如果不一样,那么说明之间有人改过,这时候给前台提示错误:数据被其他用户修改,请重新进入该画面,再进行修改 *** 作

因为mybatis把事务抽象到了TransactionManager中,而事务默认开启,所以我们只需要使用sqlSessioncommit()和rollback()方法,因为在sqlSession中,实际上调用的是transactionManager来完成的具体的事务提交和回滚 *** 作。

而你说hibernate的beginTransaction,其实这个方法不是开启事务,因为hibernate默认事务也是开启的,但是hibernate有事务状态这个概念,beginTransaction方法仅仅是把session关联的事务置为活动状态而已,并不是真正开启一个事务。

以上就是关于mybatis 多个sql的事务管理怎么写全部的内容,包括:mybatis 多个sql的事务管理怎么写、mybatis 管理事务 问题、mybatis的cache-ref怎么使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9842354.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存