两张表ID是 自增的
TabA
ID Code
1 CodeA0002
2 CodeA0003
3 CodeA0004
4 CodeA0005
5 CodeA0006TabB A_ID关联TabA的ID
ID A_ID Code
1 1 CodeB0002
2 1 CodeB0003
3 2 CodeB0004
4 2 CodeB0005
5 2 CodeB0006Code的生成是用MAX(ID) 然后组合字符串得到的向现在的表添加新记录时,先获取TabA的MAX(ID)+1(6+1)生成CodeA0007
然后Insert 新记录
TabA
ID Code
... ...
6 CodeA0007然后得到TabA的新ID(6)再获取TabB的MAX(ID)+1(6+1)生成CodeB0007
然后Insert 新记录
TabB
ID A_ID Code
... ... ...
6 6 CodeB0007
全部数据库操作都用一个事务
压力测试时,会出现重复的Code,请问这个要怎么处理调试发现,当程序中断在Insert TabA 之后,其他人还是可以继续添加记录……但库表是锁住的
中断继续之后会变成这样
TabA
ID Code
1 CodeA0002
2 CodeA0003
3 CodeA0004
4 CodeA0005
5 CodeA0006
6 CodeA0007 (中断记录)
7 CodeA0008 (中断过程中的新增记录)TabB A_ID关联TabA的ID
ID A_ID Code
1 1 CodeB0002
2 1 CodeB0003
3 2 CodeB0004
4 2 CodeB0005
5 2 CodeB0006
6 7 CodeB0007 (中断过程中的新增记录)
7 6 CodeA0008 (中断记录)
研究几天都不知道是什么问题,请高人指点
TabA
ID Code
1 CodeA0002
2 CodeA0003
3 CodeA0004
4 CodeA0005
5 CodeA0006TabB A_ID关联TabA的ID
ID A_ID Code
1 1 CodeB0002
2 1 CodeB0003
3 2 CodeB0004
4 2 CodeB0005
5 2 CodeB0006Code的生成是用MAX(ID) 然后组合字符串得到的向现在的表添加新记录时,先获取TabA的MAX(ID)+1(6+1)生成CodeA0007
然后Insert 新记录
TabA
ID Code
... ...
6 CodeA0007然后得到TabA的新ID(6)再获取TabB的MAX(ID)+1(6+1)生成CodeB0007
然后Insert 新记录
TabB
ID A_ID Code
... ... ...
6 6 CodeB0007
全部数据库操作都用一个事务
压力测试时,会出现重复的Code,请问这个要怎么处理调试发现,当程序中断在Insert TabA 之后,其他人还是可以继续添加记录……但库表是锁住的
中断继续之后会变成这样
TabA
ID Code
1 CodeA0002
2 CodeA0003
3 CodeA0004
4 CodeA0005
5 CodeA0006
6 CodeA0007 (中断记录)
7 CodeA0008 (中断过程中的新增记录)TabB A_ID关联TabA的ID
ID A_ID Code
1 1 CodeB0002
2 1 CodeB0003
3 2 CodeB0004
4 2 CodeB0005
5 2 CodeB0006
6 7 CodeB0007 (中断过程中的新增记录)
7 6 CodeA0008 (中断记录)
研究几天都不知道是什么问题,请高人指点
解决方案 »
- 请问下系统日志应该如何设计?
- dataGridView二次绑定数据源后,readOnly属性无法修改
- 关于c#截屏问题
- <pages enableEventValidation="true"/>是啥啊?大家帮我看看这个错误!在线等
- .NET Framework x64版本有什么新的东西?
- 调用API问题。
- 求救,.Net生成的DLL的调用。
- OWC技术,解决 EXCEL报表格式问题 (等待。。。)
- 如何使用正哲表达式替换?
- 一个串操作
- webbrows控件打包的问题:you must have a license to use the activex control
- 使用IHTMLDocument2怎么去判断网页有没有这样的一个元素"FoundMe"?
2楼的方法,我要怎么补0?比如CodeB0011的时候只有两个0
MAX(ID)的时候都读取到同一个id,就会出现编号重复的情况,
每个表增加一列timestamp字段
插入前获取一次timestamp的值,插入时再获取一个timestamp值比较是否相同,也可以用触发器控制 用1个字段记录更新时间modifyDate
create trigger tr_t on t
after update
as
update t
set modifyDate=getdate()
from
t join inserted i on t.ID=i.ID
--可以考虑使用自定义函数来实现:
--得到新编号的函数
create FUNCTION f_NextBH()
RETURNS char(9)
AS
BEGIN
RETURN(SELECT 'CodeA'+RIGHT(10000+ISNULL(RIGHT(MAX(code),4),0)+1,4) FROM taba WITH(XLOCK,PAGLOCK))
END
GO--在表中应用函数
CREATE TABLE taba(
id int,
code char(9) PRIMARY KEY DEFAULT dbo.f_NextBH())--插入资料
INSERT taba(id) VALUES(1)
INSERT taba(id) VALUES(2)
INSERT taba(id) VALUES(3)--显示结果
SELECT * FROM taba
先使用 SCOPE_IDENTITY() 函数获取本次插入的 ID 值,然后再 Update 刚插入的记录。
在字符串前面补 0,可以用 REPLICATE() 函数搭配 LEN() 完成。
问题已解决,谢谢大家