目录
Spring事务
数据库事务
JDBC事务
Spring事务
Redis
Redis简介
Redis命令
Java操作Redis
Spring事务
事务对增删改操作有效,对查询无效。
数据库事务
commit; //提交sql操作
rollback;//撤销sql操作
JDBC事务
JDBC API默认提交事务,每次执行sql后自动commit;
try{ 开启事务 connection.setAutoCommit(false); update1();//转账A账号扣款 update2();//入账B账号收款 提交事务/账号和账户名不匹配回滚事务 connection.commit(); }catch(){ 回滚事务 connection.rollback(); }
Spring事务
Spring框架提供了声明式事务和编程式事务两种模式。
1.编程式事务(TransactionTemplate)
transactionTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { //TODO DB操作1 //TODO DB操作2 return xxx;//返回结果 } });
2.声明式事务(XML或注解配置)
@Transactional public void doSome(){ //TODO DB操作1 //TODO DB操作2 }
切面组件--》
DataSourceTransactionManager
AOP配置@Transactional--》
作用到目标组件方法上
3.Spring声明式事务配置方法(注解版)
在spring配置txManager
<!-- Spring事务 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dbcp"></property> </bean>
开启事务注解配置支持
<!-- 开启@Transactional --> <tx:annotation-driven transaction-manager="txManager"/>
在业务组件类或方法前加@Transactional
@Service @Transactional public class EmpServiceImpl implements EmpService { @Autowired private EmpMapper empDao; // @Transactional//loadEmps方法追加事务控制;调用前开启事务,顺利结束提交事务,抛出异常回滚事务 public PageVo loadEmps(int page,int pageSize) { PageVo vo = new PageVo(); //调用EmpDao查询 Page p = PageHelper.startPage(page, pageSize); List<Emp> list = empDao.loadAll(); vo.setData(list); vo.setPage(p.getPageNum()); vo.setTotalPage(p.getPages()); vo.setTotalRecords(p.getTotal()); return vo; } }
4.@Transactional注解属性默认设置如下:
事务传播设置是 REQUIRED
事务隔离级别是 DEFAULT,根据数据库自动选择,Oracle默认READ_COMMITED级别
事务是 读/写 readOnly=false
任何 RuntimeException 将触发事务回滚,但是任何 Checked Exception 将不触发事务回滚
Redis
Redis是NoSQL(not only sql)数据库之一、非关系型数据库。
关系型数据库:oracle、mysql、db2等
Redis简介
redis是内存数据库,占用内存资源
redis采用key-value结构存储
redis支持字符串、哈希、列表、集合、有序集合5种结构。
redis支持多种编程语言,例如java、php、python等
redis读写速度异常快,经常做系统缓存使用
redis具有持久化功能、消息传递功能
Redis命令
字符串命令
set key value
get key value
incr key
incrby key n
decr key
decrby key n
key命令
keys *
del key
expire key n
哈希命令
hset key 字段名 字段值
hmset key 字段名 字段值 字段名 字段值
hget key 字段名
hmget key 字段名 字段名
hlen key //字段数量
hkeys key //查看所有字段
hdel key 字段名 //删除字段
列表命令
lpush key value
rpush key value
llen key
lrange key start end
集合命令
sadd key xxx
smembers key //获取所有元素
scard key //获取元素数量
srandmember key n //随机获取n个元素
有序集合命令
zadd key score value score value
zrange key start end //由小到大顺序排列
zrevrange key start end //由大到小顺序排列
zrem key value //删除value元素
zcount key min max //统计指定score区间元素数量
其他命令
multi、exec、discard //事务命令
save、config get dir //备份命令
subscribe xxx //订阅消息频道
publish xxx 消息 //往频道推送消息
Java操作Redis
1.通过原始驱动包操作
导入jedis.jar包
访问操作代码
@Test public void test1(){ Jedis jedis = new Jedis("localhost", 6379); jedis.set("msg", "hello");//set msg hello String msg = jedis.get("msg"); //get msg System.out.println(msg); jedis.set("age", "18"); //set age 18 jedis.incrBy("age", 2); //incyby age 2 jedis.close(); } @Test public void test2(){ Jedis jedis = new Jedis("localhost", 6379); //hmget dept no name List<String> list = jedis.hmget("dept", "no","name"); for(String s:list){ System.out.println(s); } Map<String,String> map = jedis.hgetAll("dept"); Set<String> keys = map.keySet(); for(String key:keys){ System.out.println(key+"="+map.get(key)); } jedis.close(); }
2.通过Spring框架操作
Spring提供了一个扩展到的功能包SpringData项目。spring-data-redis工具包提供了RedisTemplate对象。