我使用一个表,其中有一些随意的列,如id,name,email等...我也在每个事务中插入一个可变数量的记录,为了提高效率我需要有一个唯一的id让我们调用事务id,对于插入一个事务中的每组数据都是相同的,应该是递增的。这样做的最佳方法是什么? 我被认为使用
select max(transaction_id) from users
并在服务器端增加该值,但这样的接缝就像旧时尚解决方案一样。
答案 0 :(得分:2)
您可以使用auto_increment
列创建新表格。因此,您将能够以线程安全的方式生成唯一的整数。它会像这样工作:
DB::insert_into_transaction_table()
transaction_id = DB::mysql_last_insert_id() ## this is integer value
for each record:
DB::insert_into_table(transaction_id, ...other parameters...)
并且您不需要mysql事务。
您可以在服务器端生成唯一ID(例如GUID)并将其用于所有插入的记录。但是您的transaction_id字段应足够长,以存储以这种方式生成的值(某些char(...)
类型)。它会像这样工作:
transaction_id = new_GUID() ## this is usually a string value
for each record:
DB::insert_into_table(transaction_id, ...other parameters...)
答案 1 :(得分:2)
您可以使用自动递增主键的另一个表usergroups
,首先在那里插入一条记录(可能包括有关该组的其他一些有用信息)。然后使用mysql_insert_id()
获取在上一次插入期间生成的组的唯一ID,并将其用作插入第一个表的groupid
。
这样你仍然使用MySQL的自动编号,它可以保证你有一个独特的groupid
。执行select max(transaction_id) from users
并增加它是不安全的,因为它是非原子的(另一个线程可能在你有一个更改增加它之前读取相同的max(transaction_id)
,并将开始插入带有有冲突的groupid
)。