数据库并发操作时,修改数据的事务会影响同时要去读取或修改相同数据的事务,如果数据存储系统不存在并发控制,将会存在以下负面影响:

  1. 脏读:当一个事务更新数据,但还未提交,这时第二个数据读取数据就把刚才未提交的数据读取出来了。

  2. 不可重复读:一个事务读取数据,这时另一个事务更新了数据,然后第一个事务再次读取时数据改变了。一个事务多次读取数据时得到了不同的结果称为不可重复读。

  3. 幻读:一个事务读取特定的行,第一次读取时没数据,这时另一个事务插入数据,但第一个事务还没有结束,再次读取时就有数据了,这称为幻读。


   数据库系统通过定义事务的隔离来定义哪一级的并发控制,SQL SERVER支持如下五种隔离级别:

  1. 未提交读:最低级别,只保证不读取物理上损坏的数据

  2. 提交读:默认级别,可预防脏读

  3. 可重复读:可预防脏读和不可重复读,但有时会出现幻影数据

  4. 快照:使用行版本控制来预防幻读,同时减少阻塞

  5. 可序列化:最高级别,要求事务序列化的一个接一个执行,不能并发执行


   

   MSSQL中隔离级别的查看和更改方法:

  1. MSSQL中默认的隔离级别为Read Committed

  2. DBCC USEROPTIONS查看当前SQL Server事务的隔离级别(isolation level属性列)

  3. T-SQL语句中设定隔离级别:SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED/READ COMMITTED/REPEATABLE READ/SNAPSHOT/SERIALIZABLE;

  4. 开发环境中设定:使用 System.Data.SqlClient 托管命名空间的 ADO.NET 应用程序可以调用 SqlConnection.BeginTransaction 方法并将 IsolationLevel 选项设置为 Unspecified、Chaos、ReadUncommitted、ReadCommitted、RepeatableRead、Serializable 或 Snapshot。

    代码如下:

    System.Data.SqlClient.SqlConnection con = new SqlConnection();

    con.BeginTransaction(IsolationLevel.ReadUncommitted);