事物(Transaction)+ThreadLocal

事物

事物:从数据库角度,就是完成业务需要执行的sql集合,这个集合统称事物
增删改有事物 查没有事物
ACID通俗理解就是几个sql语句绑定在一起要么一起执行 要么都不执行
在这里插入图片描述
ACID
A:原子性 物理上原子不可分割 组成事物的语句不管多少条 都是整体 不可分割 共同命运~
在这里插入图片描述
C:一致性 要么一起执行要么都不执行
在这里插入图片描述
I:隔离性 事物和事物之间不受影响
在这里插入图片描述
D:持久性 事物对数据的修改是永久的
在这里插入图片描述
在这里插入图片描述

事物控制语句

在这里插入图片描述

start transcation;
commit;
rollback;
set autocommit=0/1;

初始表
在这里插入图片描述
在这里插入图片描述
通过select在控制台显示的表
在这里插入图片描述
数据库中的表没有变化
在这里插入图片描述
发现事物没有提交回滚之前
通过select返回的表 和 数据表是不一致的 控制台返回的是一个虚假的情况脏读
原因当开启事务后数据库中Mysql参与操作的表就会被锁起来
在这里插入图片描述

在这里插入图片描述
现在返回的表状况和数据库的表就一致了

ThreadLocal

在这里插入图片描述

在这里插入图片描述

多线程并发:每个线程相互独立/线程隔离

实现: 模拟线程之间成员变量互相隔离
线程不隔离:从线程A里面取出了线程B里的变量

  • 可以用sychronized来防止线程内容乱窜 排队一个一个运行 但失去了并发性 大家都共享同一个数据 只是不同线程访问时对这个数据进行更新操作 并没有每个线程都有一个自己的变量 然后互相隔离 和每个线程的变量互相隔离不是一个概念
ThreadLocal:
demo.setContent(String str){ threadlocal.set(str)};
demo.getContent(return threadlocal.get());

sychronized:
demo.setContent(String str){ this.str=str};
demo.getContent(return str;);

在这里插入图片描述
在这里插入图片描述

ThreadLocal应用场景

在这里插入图片描述

引言:在转钱的时候如果A给B转了100 service有编译错误无法转让成功 但数据库(dao层)还是进行了减的转账操作 B没有增加

  • 上面也讲到事物的原子性和一致性A和B要么同时成功 要么同时失败所以解决这个引言的方法就是开启事物 让service层和dao层在同一事物下保持原子性一致性
    如果serivce有编译错误 那你dao层也要事务回滚 不能改变数据库

  • 因为本程序使用的是JDBC事物 dao层已经有了connection对象在这里插入图片描述

  • service里面还没有事物对象只是调用Dao 我们在service层中添加JDBC事物并且完成JDBC的api

  • 此时service一个Connection事物对象 Dao一个Connection事物对象 为了保证service层和dao层的操作的一致性和原子性 我们必须让他们两层的操作都属于一个事物
    在这里插入图片描述
    在这里插入图片描述

  • 将Connection放入线程容器里 在同一线程下(一次执行下的service 和 dao 层)线程容器可以传递参数保证共用同一连接 ,多个线程(多个客户同时进行转账操作)同时运行的时候又能线程隔离互不干扰成员变量与当前线程绑定

  • 我们让JdbcUTILS中返回Connection的函数从直接从连接池中获取改进为从线程容器获取
    在这里插入图片描述

  • 在这里插入图片描述

  • connection是公共参数 当前线程在获取后,运行的时候线程把其于当前线程绑定设置为局部变量,还是互相隔离的

总结线程容器的作用:
1.在同一线程中进行公共参数的传递
2.成员变量只与当前线程绑定,线程隔离,
3.并发状态,比锁来的快,锁是同步资源一个一个,线程容器是多个资源,并发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值