我是用的spring集成的
1可以用aop,切面控制事务
2可以用注解控制事务(申明式事务)
3编程式事务
jdbcxml
<xml version="10" encoding="UTF-8"><beans xmlns=";
java代码:
申明式事务,关键字@Transactional
@Transactionalpublic 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怎么使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)