事务的并发问题
1. 脏读:
当事务A读取了事务B更新的数据后,事务B回滚了,那么事务A读到的数据是脏数据。
2. 不可重复读:
事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据进行了更新操作并提交,导致事务A多次读取同一数据时,结果是不一致的。
3. 幻读:
管理员A把数据库中所有学生的成绩按照分数,改成ABCDE几个等级,这时候管理员B往表里插入了一条具体分数的数据,管理员A改结束时,就会发现有一条数据没有修改,好像产生了幻觉一样,这就是幻读。
不可重复读和幻读的区别:不可重复读是偏向于更新,幻读偏向于插入和删除。解决不可重复读的问题只需要锁住满足条件的行,解决幻读需要锁表。
事务的隔离级别
从低到高
1. 读未提交(Read uncommitted)
其实就是事务没提交就可以读,很显然这种隔离级别会导致读到别的还没提交的数据,一旦基于读到的数据做了进一步处理,而另一个事务最终回滚了操作,那么数据就会混乱,而且很难追踪,总的来说,读未提交级别会导致脏读。
2. 读提交(Read committed)
顾名思义就是事务提交了之后才能读,假设你拿着银行卡区消费,付费之前你看到卡里有2000元,这个时候你老婆在淘宝购物,赶在你之前完成了支付,这个时候你再支付的时候会提示余额不足,但是你明明看到卡里的钱是够的。
这就是这两个事务在执行时,事务A一开始读取了卡里有2000元,这个时候事务B把卡里的钱花完了,事务A最终再确认余额的时候发现卡里已经没有钱了。很显然,读提交可以解决脏读问题,但是解决不可重复读。
SQL Server, Oracle的默认隔离级别是读提交
3. 可重复读(Repeatable read)
看名字就知道它的出现时为了解决不可重复读问题。事务A一旦开始执行,不管事务B怎么改数据,事务A永远读到的就是它刚开始读的值。那么问题来了,假设事务B把id为1的数据改成了2,事务A并不知道id发生了变化,当事务A新增数据的时候却发现id=2的数据已经存在了,这就是幻读。
MySql的默认隔离级别就是可重复读
4. 序列化(Serializable)
这个就是无敌的存在了。所有的事务串起来一个个执行,因为没有并发场景出现,什么脏读,不可重复读,幻读通通不存在的。但是同样的,基本并发能力会非常差。
最终,到底什么隔离级别完全要根据自己的业务场景选择,没有最好的,只有最合适的。
网络TCP与UDP
1. 概念
TCP:是面向连接的,可靠的流协议。可以提供面向连接的,可靠的,点到点的通信。
UDP:是不具有可靠性的数据报协议。细微的处理它会交给上层应用去完成。
2. 特点
UDP:每一次发送数据都需要绑定IP和端口号。相当于发送邮件,只管是否发送成功,不管对方是否收到数据包,所以UDP是不安全的,有可能会丢失数据。类似于HTTP,也属于短连接。
TCP:只需要一次连接,属于长连接,只要不断开的情况可以一直使用。TCP好像打电话。双方要通话,首先,要确定对方是否开机(网络可以到达),然后要确定是否有信号,最后还需要对方接听(通信连接)。TCP通过3次“握手”来保证数据发送的安全性,不会丢失数据包。
3. 区别
(1). TCP面向连接(如打电话要先拨号建立连接);
UDP是无连接的,即发送数据之前不需要建立连接。
(2). TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;
UDP尽最大努力交付,即不保证可靠支付。
(3). TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;
UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速度降低(对实时应用很有用,如IP电话,实时视频会议等)。
(4). 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
(5). TCP首部开销20字节;UDP首部开销小,只有8个字节
(6). TCP的逻辑通信信道是全双工的可信信道,UDP则是不可信信道
PHP中的session存储
session数据保存再哪里呢?
当然是服务器端,但不是保存再内存中,而是保存在文件或数据库中。
默认情况下,php.ini中设置的session保存方法是files(session.save_handler=files),即:使用读写文件的方式保存session数据,而session文件保存的目录由session.save_path指定,文件名以sess_为前缀,后跟session id,如:sess_c72665af28a8b14c0fe11afe3b59b51b。文件中的数据即是序列化之后的session数据。
如果访问量大,可能产生的session文件会比较多,这时可以设置分级目录进行session文件的保存,效率会提高很多,设置方法为:session.sava_path="N;/sava_path",N为分级的级数,sava_path为开始目录。
当写入session数据的时候,php会获取到客户端的session id,然后根据这个session id到指定的session文件保存目录中找到相应的session文件,不存在则创建之,最后将数据序列化之后写入文件。读取session数据也是类似的操作流程,对读出来的数据需要进行解序列化,生成相应的session变量。
session id保存在哪里呢?
保存在客户端的cookie中
网友评论