Spring框架(十一)Spring事务+Redis

目录
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对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值