例子
目前工资为1000的员工有10人。
事务1,读取所有工资为1000的员工。
这时事务2向employee表插入了一条员工记录,工资也为1000
事务1再次读取所有工资为1000的员工 共读取到了11条记录
解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加 新数据,则可避免该问题
不可重复读的重点是修改 :
同样的条件, 你读取过的数据,再次读取出来发现值不一样了
幻读的重点在于新增或者删除
同样的条件, 第 1 次和第 2 次读出来的记录数不一样
3.什么是不可重复读
是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外 一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间, 由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一 样的。这样在一个事务内两次读到的数据是不一样的,因此称为是不可 重复读
例子
在事务1中,Mary 读取了自己的工资为1000,操作并没有完成
在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.
在事务1中,Mary 再次读取自己的工资时,工资变为了2000
解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。
3.隔离级别
事务的四大特性分别是:原子性、一致性、隔离性、持久性
幻读和不可重复读都是在同一个事务中多次读取了其他事务已经提交的事务的数据导致每次读取的数据不一致,所不同的是不可重复读读取的是同一条数据,而幻读针对的是一批数据整体的统计(比如数据的个数)
以MYSQL数据库来分析四种隔离级别
第一种隔离级别:Read uncommitted(读未提交)
如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据,该隔离级别可以通过“排他写锁”,但是不排斥读线程实现。这样就避免了更新丢失,却可能出现脏读,也就是说事务B读取到了事务A未提交的数据
解决了更新丢失,但还是可能会出现脏读
第二种隔离级别:Read committed(读提交)
如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
解决了更新丢失和脏读问题
第三种隔离级别:Repeatable read(可重复读取)
可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务(包括了读写),这样避免了不可重复读和脏读,但是有时可能会出现幻读。(读取数据的事务)可以通过“共享读镜”和“排他写锁”实现。
解决了更新丢失、脏读、不可重复读、但是还会出现幻读
第四种隔离级别:Serializable(可序化)
提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行,如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读
解决了更新丢失、脏读、不可重复读、幻读(虚读)
4.事务四大特性
如果一个数据库声称支持事务的操作,那么该数据必须具备以下四个特性:
原子性、一致性、隔离性、持久性
原子性(Atomicity)
一次事务中如果进行多个数据操作的业务,最终的结果要么所有操作都成功,要么所有操作都失败
DEMO:转账
A转账给B,转了1000元,最终的结果要求:A的账户减少1000元,B的账户增加1000元,不能出现A账户减少了,但是B没有增加
1
一致性(Consistency)
一致性就是数据表的数据更新要求合乎逻辑的特性,满足了原子性不一定满足一致性。
DEMO:转账
A转账给B1000元,最终结果:A账户减少1000元,但B账户增加100元,此时事务是满足原子性的,但是不合乎逻辑,就不满足事务的一致性了
1
隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,此时同时操作一条数据,数据库为每一个用户开启的事务(为该数据上锁,其它事务在上一个事务操作完毕之前是不能操作该数据的),不能被其它事务的操作所干扰,多个并发事务之间要互相隔离
持久性(Durability)
持久性是指一个事务一旦被提交(COMMIT)了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
5.mybatis dao中的xml标签
6.cookie和session 的区别失效时间
1.cookie数据存放在客户端浏览器上,session数据存放在服务器上
2.cookie不是很安全,别人可以分析存放在本地cookie并进行cookie欺骗,考虑到安全应使用session
3.session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie
4.单个cookie保存数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie
5.建议:
将登陆信息等重要信息存放在session
其他信息如果需要保存,可以放在cookie中
8.redis
9.spring controller 用的__什么注解