在SQL中,当对数据库中的一个表进行并发操作时,会出现 数据丢失、不可重复读、脏读和幻影读的情况。
处理该并发问题的解决方法:
1 封锁:
1.1 共享锁(又称读锁,如果事务A1用共享锁读取数据B,A1事务没有结束,那么事务A2在A1事务期间,可以 用共享 锁来读取数据,但不能用排它锁来修改数据。)
1.2 排它锁:(又称写锁,如果事务A1用排它锁来操作数据B,那么只能是事务A1来对数据B进行读写操作,其它事务不可以对数据B进行任何操作。)
2 封锁协议:
具体分为1,2,3个级别(具体作用是对锁的做出的限制规则,这里不作讨论)。
3 事务隔离级别:
SQL主要通过事务隔离级别在后台自动进行锁的操作,来解决并发操作一致性的问题。具体分类如下:
3.1 ReadUnCommitted:相当于NOLOCK,并发操作会出现 数据丢失、不可重复读、脏读和幻影读的情况。
3.2 ReadCommitted:SQL数据库默认的事务隔离级别。
在对数据进行读的时候,用共享锁(有效时间,读取时间);
在对数据进行修改操作时用排它锁(有效时间,事务时间),在事务级别是ReadCommitted级别并对数据进行修改时,其它事务是不能对数据进行任何读写操作的。
在这种级别下并发操作不会出现数据丢失和脏读的情况,但会出现不可重复读和幻影读的情况。
3.3 RepeatableRead:可重复读,有效期间在事务执行期间。在事务A读取数据,其它事务不可以修改数据(插入除外)
在这种级别下并发操作不会出现数据丢失,脏读,不可重复读的情况;但是,还会出现幻影读的情况。
3.4 Serializable:A1事务读取执行期间,其它事务部可以对事物进行任何操作。
在这种级别下并发操作不会出现数据丢失,脏读,不可重复读和幻影读的情况。
参考引用:http://www.cnblogs.com/zhenyulu/articles/330494.html 很经典