假如有两个事务并发,顺序如下:
那么在事务A中,query1跟query2查询出来的结果是否一样呢?这就跟事务隔离级别有关了。
SQL的标准定义里面,一共有四种级别:
1.?????? read uncommited :读取未提交的数据.就是其他事务已经修改但还未commit的.
2.?????? read commited :读取已提交的数据query2会跟query1读取的数据不一样.
3.?????? repeatable read :可重复读取,即query1跟query2读取的数据是一样的.
4.?????? serializable :序列化.
SQL 标准用三个必须在并行的事务之间避免的现象定义了四个级别的事务隔离。
这些不希望发生的现象是:
1.?????? 脏读(dirty reads):一个事务读取了被另一个事务改写但还没提交的数据.
2.?????? 不可重复读(non-repeatable reads):一个事务重新读取前面读取过的数据, 发现该数据已经被另一个已提交的事务修改过(一个事务执行相同的查询两次或两次以上,但每次查询结果都不同时。这由于另一个并发事务在两次查询之间更新(update)了数据).
3.?????? 幻读(phantom read):在两次查询同一时间点数据时,发现数据数量发生改变。(当一个事务读取几行记录后,另一个并发事务插入(insert,delete)一些记录).
SQLServer
我们首先在SQLServer上做了实验,SQLServer一共支持四种隔离级别,read uncommited跟read commited我们没有实验,我们直接先实验repeatable read.
如果事务A定义了如下级别,那么当事务B执行到modify1这条语句时,如果modify1是update的话,就被锁起来,一直等到事务A提交完以后,锁才会被释放。
而如果是insert的话,则可以顺利进行下去,然后在事务A