概述
数据库事务隔离和锁的东西,学习了一下,现讲解一下自己的理解
数据库事务隔离
概念
事务:把多条sql语句作为一个整体和数据库交互。这里需要注意,一个事务可有多条SQL语句,虽然这些SQL语句最终的结果变成一个整体,要成功都成功,要失败都失败,但是,里面的每条SQL语句却是单条执行的。
数据库事务隔离:讲的是多个事务(操作同一张表)之间,一个事务内部单条select语句执行的结果在其他事务中的时机。
事务隔离级别
Read Uncommitted:读未提交,事务中的select语句查询表的结果是,其他事务未提交的时刻,即,事务1对表1的select,查到了事务2的Update语句的结果,虽然,事务2中update之后的语句还没有执行。
Read Committed:读已提交,事务1对表1的select,查到的结果是其他对表1以commit的事务,实机是其他事务执行完成,对于其中途的更新,事务1不会读到结果。
Repeatable table:可重复读,事务1中对表1的select读到的结果是不变的,注意,如果读后有更新操作,并且又读表1,那么,此时读到的是已提交的数据,所以,这个隔离级别有可能产生幻读(后面讲这个概念)。
Serializable:序列化,事务的各种问题,都是因为数据库允许多个事务可以并行执行,但是,如果我们让数据库串行执行事务,那么不就什么问题都没有了嘛,Serializable就是这个隔离级别
脏读、幻读、可重复读和不可重复读
这些概念的产生也是因为多个事务并发产生的,所以,在理解这些内容的时候,一定要想着多个事务同时执行的这么一个情况。
脏读:事务1对表1的select查询(一条记录),读取的是事务2对表1(该条记录)update结果后的内容,此时,事务2回滚,此时事务1读到的数据就是脏数据,称此为脏读,即:这条记录的内容是不真实的。
幻读:事务1对表1的select查询获得结果(一条记录)后,事务2对表1insert一条记录,然后,事务1又使用该select语句查询结果(两条记录),发现信息量的变了,称此为幻读,即:原信息内容没有变,但是量不同了。
重复读:事务1对表1的select查询得到结果后,这个结果是在之后的select查询是不变的(之前没有更新语句) ,称此为重复读。不可重复读与之相反。
数据库锁
关于数据库锁的内容,只讲解共享锁,更新锁和排它锁的特性。
共享锁、更新锁和排它锁之间的关系
单个资源可以有多个共享锁;单个资源有了排他锁后,不可以加其它的锁;单个资源上有了其它锁(共享锁或更新锁)后,不可以再给这个资源直接加上一个排它锁;单个资源只能有一个更新锁;单个资源可以在有更新锁的同时,再给资源加上共享锁,并且,之后,这个资源的更新锁可以在这个共享锁存在的时候进行升级,转换为排它锁;
死锁
单个SQL语句都具有锁,默认的select语句执行时,给资源加了共享锁,一旦select执行完成,那么这个共享锁也就没有了,即使默认select语句在事务中,此时易造成一个死锁,那就单个select执行的时间太长,并且执行的次数多,这个时候,表内容的更新就会等,等到表中一个共享锁都没有的时候才可以执行,这种情况的执行我们可以使用单条select不加共享锁的语句解决。
更新的SQL语句加的为排它锁,当更新语句在事务中时,就会把锁的生命周期变成和事务一样的长,此时需要注意,访问资源的顺序,可能会造成死锁的问题。
总结
上面的内容不是很完整,例如:事务的隔离级别对脏读、幻读和不可重复读的影响。死锁的那块内容下去可以接在SQL Server上做实验。