用悲观并发方式处理数据库并发冲突以保证数据一直性的代码处理方法
2010-07-08 00:00:00 来源:WEB开发网悲观处理方式是 采用SQLSERVER数据库中“事务+锁”!
先上伪代码再解释:
1.先解释2个要用到的锁
SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除
SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除
PS:这2个是表级锁,要锁行加上SQL过滤条件即可。数据库的默认隔离级别是readcommit,
SqlCommand cmd = new SqlCommand("SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;select * from Users WITH(rowlock) where id = 2", connection, st);重设事务的隔离级别可以用行锁。
2.在一个管理页面执行Update,Delete操作的时候(起码能得到实体的主键ID数据及其修改后的数据),在代码处理的时候:
客户A在某个管理页面执行如下操作
private void button1_Click(object sender, EventArgs e)
{
SqlTransaction st = null;
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
connection.Open();
using (st = connection.BeginTransaction())
{
this.Cursor = Cursors.WaitCursor;
SqlCommand cmd = new SqlCommand("select * from Users WITH(HOLDLOCK) where id = 2;update Users set name = 'C罗',address = 'basi' where id = 2", connection, st);
cmd.ExecuteNonQuery();
System.Threading.Thread.Sleep(20000);
st.Commit();
MessageBox.Show("ok。。。s1");
}
}
catch
{
st.Rollback();
}
finally
{
connection.Close();
this.Cursor = Cursors.Default;
}
}
}
- ››并发
更多精彩
赞助商链接