事物
事物:从数据库角度,就是完成业务需要执行的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.并发状态,比锁来的快,锁是同步资源一个一个,线程容器是多个资源,并发。