我遇到LAST_INSERT_ID()
的问题。
每次我使用它时,我都需要打开和关闭新连接。 这大大减慢了我的应用程序。 我需要做很多插入语句,最后得到每个插入的id 一切都在同一个连接上! 如何在同一连接上获取最后插入的ID 用于来自特定表的MySQl,ODBC和C#而没有并发问题?
这是我的代码:
#region Private Variables
private static DataAccess _DataAccess = null;
private static object _SyncLock = new object();
private OdbcConnection myConnection = null;
#endregion
#region Instance Method
public static DataAccess Instance
{
get
{
lock (_SyncLock)
{
if (_DataAccess == null)
_DataAccess = new DataAccess();
return _DataAccess;
}
}
}
#endregion
#region Constractors
public DataAccess()
{
myConnection = new OdbcConnection(stringConnDB);
myConnection.Open();
}
#endregion
答案 0 :(得分:4)
每次我使用它时,我都需要打开和关闭新连接
不,您不需要新连接。您应该在插入语句之后在同一连接上使用它。
来自manual:
生成的ID在每个连接的服务器中维护。这意味着[
LAST_INSERT_ID
]返回给定客户端的值是由客户端影响AUTO_INCREMENT
列的最新语句生成的第一个AUTO_INCREMENT
值。此值不受其他客户端的影响,即使它们生成自己的AUTO_INCREMENT
值。此行为可确保每个客户端都可以检索自己的ID,而无需关心其他客户端的活动,也无需锁定或事务。
答案 1 :(得分:3)
为什么您认为需要打开新连接?实际上你应该不打开一个新的连接,你应该在同一个连接上使用last_insert_id()
,以确保得到正确的结果。
如果您尝试使用新连接并且它似乎有效,那么这只是因为连接被合并,并且您碰巧第二次获得相同的连接。当您开始与多个单个用户一起使用时,它将失败。