protected void Button1_Click(object sender, EventArgs e)
{
string strconn = "server=pc1234;database=WangDian;uid=sa;pwd=123456";//連接數據庫
SqlConnection conn = new SqlConnection(strconn);
conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT COUNT(*) FROM 管理員 WHERE 賬號=@username and 密碼=@passwd";
cmd.Parameters.Add(new SqlParameter("username", txtUserName.Text));
cmd.Parameters.Add(new SqlParameter("passwd", txtPwd.Text));
int i = Convert.ToInt32(cmd.ExecuteScalar());
if (i > 0)
{
Response.Write("<script> alert('添加數據失敗!')</script>");
txtUserName.Text = "";
txtPwd.Text = "";
}
else
{
cmd.CommandText = "INSERT INTO 管理員(賬號,密碼)VALUES(@username,@passwd)";
int var = cmd.ExecuteNonQuery();
if (var > 0)
{
Response.Write("<script> alert('添加數據成功!')</script>");
txtUserName.Text = "";
txtPwd.Text = "";
}
conn.Close();
}
}
}
這是注冊的那個按鈕,怎么解決防止兩個人 同一時間同時注冊一個賬號
14 个解决方案
你可以把 [賬號] 聲明為 primary key。
用程序和數據庫實現 隨便你選啊
說個簡單的你在數據庫建個唯一索引不就插不進去了
存儲過程,事務,都行
總之你得保證查詢和插入是在同一個過程里,避免出現臟數據
如果不考慮用戶的體驗,只是防止重復注冊
那么用樓上2位的辦法當然是最簡單的.
當然這樣一來你就無法區分到底是因為有其他用戶搶先注冊了賬號導致插入失敗,還是由於網絡問題或數據庫問題導致插入失敗
用事務?一定要?
那就是建個存儲過程,開始事務(這個要求表鎖),先select有沒有用戶,沒有才insert
你把查詢和新增放到一個事物里 應該可以吧
Begin
select table
有 就 Rollback
沒有 就
insert table
Commit
這樣應該可以吧
1、在插入前先檢查是否存在
2、數據庫底層用主鍵或唯一索引確保無臟數據進入
username增加唯一性約束
代碼層 可以加 lock 防止多個線程同時操作