读取现象和隔离级别
读取现象和隔离级别在学习 MySQL 的事务机制时,发现不同的课程,对于读取现象和隔离级别的解释存在较大差异(主要是读取现象中的不可重复读和幻读,以及隔离级别中各级别下可能发生的读取现象)。
上网进一步查询后,发现这方面的解释确实是众说纷纭,为了理清这两个概念,我不得不从官方资料入手来查证。
官方资料
SQL-92 Standard
SQL-92 Standard 应该是这两个概念的源头。
读取现象:
脏读:SQL 事务 T1 修改了某一行。在 T1 执行 COMMIT 之前,SQL 事务 T2 已经可以读到这一行的修改。如果 T1 执行了 ROLLBACK,那么 T2 将读到从没有提交过的行,因此可以认为是读到了从未存在过的一行数据。
不可重复读:SQL 事务 T1 读到了一行数据,SQL 事务 T2 紧接着提交了对该行数据的修改和删除。此时如果 T1 尝试重新读取该行,它可能接收到的是修改后的值或者发现该行已被删除。
幻影(读):SQL 事务 T1 读到满足某些<搜索条件>的行集合。然后,SQL 事务 T2 执行了一些 SQL 语句并提交,这些 SQL 语 ...
多用户通信系统 - Socket 编程使用对象流进行通信的踩坑记录
多用户通信系统 - Socket 编程使用对象流进行通信的踩坑记录在多用户通信系统项目中,客户端 Socket 与服务端 Socket 的所有通信均使用对象流的方式来完成。一切很好,直到在完成离线发送消息/发送文件功能时,我才踩到在 Socket 编程中使用对象流通信的坑
java.io.StreamCorruptedException: invalid stream header: 7371007E在数据通道某一端的 Socket 使用同一个 ObjectOutputStream 写多个对象,但在另外一端的 Socket 使用不同的 ObjectInputStream 来读数据通道内的多个对象,就会产生异常:java.io.StreamCorruptedException: invalid stream header: 7371007E。
参考:StackOverflow - java.io.StreamCorruptedException: invalid stream header: 7371007E 高赞回答可知该异常发生的原因(虽然提问者问得不太好):
The error ...
坦克大战 - 防止敌人坦克重叠 踩坑记录
坦克大战 - 防止敌人坦克重叠 踩坑记录目前,我们在 chapter_18 中完成的坦克大战 0.4 版还存在一个问题:敌人坦克在运动时会发生重叠现象!现在在 chapter_20 中我们就要解决这个问题。
启动点(目前我的坦克大战代码)
我的启动点和老韩的代码存在一定差异,这里先给出目前我的坦克大战代码,方便后续基于我的代码实现时进行说明
Tank 类:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214 ...
原码反码与补码
原码反码与补码在 0098_韩顺平Java_原码 反码 补码 中,提到了原码补码和反码的概念,下面给出一些补充的非常有助于理解的相关博文!
相关博文
原码、反码、补码的产生、应用以及优缺点有哪些? - 李俊达的回答 - 知乎:快速入门,但未涉及到本质
补码的本质看下面两篇文章:
在8位二进制中,-128 没有原码、反码形式,那么它的补码是怎么计算出来的?还是约定的? - Simon Cao的回答 - 知乎
为什么-0的补码是00000000? - Coldwings的回答 - 知乎
浮点数使用陷阱
浮点数使用陷阱问题在 P45 0044_韩顺平Java_浮点数细节2 中,提到了浮点数使用陷阱:2.7 和 8.1 / 3 比较
1234double n8 = 2.7;double n9 = 8.1 / 3; // 数学上,除法结果就是 2.7System.out.println(n8); // 输出 2.7System.out.println(n9); // 输出一个接近 2.7 的小数:2.6999999999999997
为什么 n8 的输出是 2.7,而 n9 的输出是 2.6999999999999997?
要把这个问题彻底解释清楚不是一件简单的事情,其中涉及到:
十进制到二进制的转换
浮点数 IEEE 754 标准,以及该标准下的除法运算
Java 的浮点数输出的设计机制
以上 1.2. 涉及到计算机组成原理方面的知识,3. 则是涉及到浮点数转字符串的算法
解释当然,这里也没必要太深入其中的细节,一个简单的解释是:
因为二进制表示能力有限,绝大多数的十进制小数,转换为二进制后就变成了无限循环小数。而计算机的存储空间是有限的,给每个浮点数分配的存储空间自然也是有限 ...
Lec21 - 特征值和特征向量
第 21 课 特征值和特征向量特征值与特征向量初探给定矩阵 $A$ ,矩阵 $A$ 乘以向量 $x$,就像是使用矩阵 $A$ 作用在向量 $x$上,最后得到新的向量 $Ax$。在这里,矩阵 $A$ 就像是一个函数,接受一个向量 $x$ 作为输入,给出向量 $Ax$ 作为输出。
在这一过程中,我们对一些特殊的向量很感兴趣,也即 $x$ 和 $Ax$ 始终保持同一个方向,这是比较特殊的,因为在大多情况下,$Ax$ 与 $x$ 指向不同的方向。
在这种特殊的情况下,$Ax$ 平行于 $x$,我们把满足这个条件的非零向量 $x$ 称为 $A$ 特征向量,而 $\lambda$ 为 $A$ 的特征值 。这个平行条件用方程表示就是:
\displaylines{
Ax=\lambda x
}对这个式子,我们试着计算特征值为 $0$ 的特征向量,易得 $Ax=0x=0$,因此,特征值为 $0$ 的特征向量位于 $A$ 的零空间中。
显然对于奇异矩阵(不可逆),必然存在非零向量使得 $Ax=0$,所以若矩阵是奇异的,那么它有一个特征值为 $\lambda =0$。
我们先来看投影矩阵 $P=A(A ...
Elementary Sorts
Elementary SortsInterview Questions: Elementary Sorts (ungraded)1. Intersection of two sets.Given two arrays a[] and b[], each containing $n$ distinct 2D points in the plane, design a subquadratic algorithm to count the number of points that are contained both in array a[] and array b[].
Note: these interview questions are ungraded and purely for your own enrichment. To get a hint, submit a solution.
subquadratic : Describing an algorithm that runs in greater than linear, but less than quadrati ...
Lec20 - 克拉默法则、逆矩阵、体积
第 20 课 克拉默法则、逆矩阵、体积本节是关于行列式的最后一课,经过前两节课的努力,我们研究了行列式的性质,并从性质出发得到了行列式的求解方法。这一节我们将介绍行列式的应用,主要包含三个方面:求逆矩阵,克莱姆法则和体积。
求逆矩阵 $A^{-1}$早在第三课,我们就已经介绍了求解逆矩阵的方法:高斯-若尔当求逆法。高斯-若尔当求逆法对于数值计算无懈可击,但很难想象这是如何做到的,也许我们需要一个更直观的逆矩阵的代数表达式,这就用到了行列式的知识。
我们先给出二阶逆矩阵公式:$\begin{bmatrix}a& b\\c& d\end{bmatrix}^{-1}=\frac{1}{ad-bc}\begin{bmatrix}d& -b\\ -c& a\end{bmatrix}$ ,从 $2\times 2$ 的情况中,我们能够看出一些端倪。
首先关注公式的分母,其为行列式的值,也许一般逆矩阵公式其中一部分正是 $1$ 除以矩阵的行列式,这一部分是合理的,因为只有当行列式的值不等于 $0$ 时,矩阵才是可逆的。
接下来的问题是,公式右边那一块矩阵是什么?从代数 ...
Stacks And Queues
Stacks And QueuesInterview Questions: Stacks and Queues (ungraded)1. Queue with two stacks.Implement a queue with two stacks so that each queue operations takes a constant amortized number of stack operations.
Note: these interview questions are ungraded and purely for your own enrichment. To get a hint, submit a solution.
Solution
思路很简单,用到栈逆序输出其中元素的特性,一个栈 inStack 用作 enqueue,一个栈 outStack 用作 dequeue。在 dequeue 时先检查是否 outStack 中有元素,如果没有先将 inStack 中所有元素依次 pop 出再 push 到 outStack 中去,此时元素结果两次逆序,自然输出为顺序 ...
Assignment2 - Queues
Assignment2 - Queues
作业网站:Assignment2-Queues,包含本次作业的说明,FAQ,相关的有用资源文件。
Deque
Performance requirements. Your deque implementation must support each deque operation (including construction) in constant worst-case time. A deque containing n items must use at most 48n + 192 bytes of memory. Additionally, your iterator implementation must support each operation (including construction) in constant worst-case time.
对于 deque 的每个操作都要求 $O(1)$ 的时间复杂度。如果才用 resizing-array 实现,那么在需要 resize 操作时,显然操作的时间复杂度不满足 ...