美文网首页
面试题2--事务的并发与隔离级别,TCP与UDP,SESSION

面试题2--事务的并发与隔离级别,TCP与UDP,SESSION

作者: Amy1234567 | 来源:发表于2021-08-26 17:23 被阅读0次

    事务的并发问题

    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中

    相关文章

      网友评论

          本文标题:面试题2--事务的并发与隔离级别,TCP与UDP,SESSION

          本文链接:https://www.haomeiwen.com/subject/iloeiltx.html