关于。。SQL并发的问题。。。金融行业。。听说。。。不能有并发。。。听说要列队。。。听说。。我不会弄。。这个不是听说。。这个是真的不会弄。。

xghabc 2014-05-09 09:38:21
RT。。

金融行业。。金额操作。。不能有并发。。。

所以,就是列队来解决。。储存过程加列队。。。

问了一下Q群的。。说,列队写在数据库不科学。。

有给了几个信息列队的软件。。。

只是。。 还不太明白。。写在数据库的还好意思,SQL语句或储存过程都在表内面的一个字段记录着。。

那些信息列队软件怎么弄。。怎么记录SQL语句或者储存过程昵。。。

还有就是。。怎么保持一致性昵。。就是SQL语句执行完了,这个队列状态改为己执行。。。

只有这么多分了。。。
...全文
494 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
xghabc 2014-05-19
  • 打赏
  • 举报
回复
来人顶一下。。
xghabc 2014-05-17
  • 打赏
  • 举报
回复
引用 35 楼 sz_haitao 的回复:
[quote=引用 34 楼 xghabc 的回复:] 顶一下。。。来人啊。。
这么多人 都说了这么清楚了,你当大家都不是人?! 【不对。。执行是一个线程执行。。可以是。。是交叉执行。。不是一个事务执行,然后顺序一条一条做。。 也是,一个事务A,A的内容,一个B 事务,B的内容,然后一个A事务A的内容,一个B事务,B的内容。。是交叉执行。。】 这话是什么意思?你是90后吗?[/quote] 这个就是并发执行的情况。。
xghabc 2014-05-17
  • 打赏
  • 举报
回复
引用 35 楼 sz_haitao 的回复:
[quote=引用 34 楼 xghabc 的回复:] 顶一下。。。来人啊。。
这么多人 都说了这么清楚了,你当大家都不是人?! 【不对。。执行是一个线程执行。。可以是。。是交叉执行。。不是一个事务执行,然后顺序一条一条做。。 也是,一个事务A,A的内容,一个B 事务,B的内容,然后一个A事务A的内容,一个B事务,B的内容。。是交叉执行。。】 这话是什么意思?你是90后吗?[/quote] 不是。。就是说,事务有两种,一种是串行执行,一个是并发执行。。
haitao 2014-05-16
  • 打赏
  • 举报
回复
引用 34 楼 xghabc 的回复:
顶一下。。。来人啊。。
这么多人 都说了这么清楚了,你当大家都不是人?! 【不对。。执行是一个线程执行。。可以是。。是交叉执行。。不是一个事务执行,然后顺序一条一条做。。 也是,一个事务A,A的内容,一个B 事务,B的内容,然后一个A事务A的内容,一个B事务,B的内容。。是交叉执行。。】 这话是什么意思?你是90后吗?
xghabc 2014-05-16
  • 打赏
  • 举报
回复
顶一下。。。来人啊。。
haitao 2014-05-14
  • 打赏
  • 举报
回复
引用 31 楼 xghabc 的回复:
[quote=引用 29 楼 sz_haitao 的回复:] [quote=引用 27 楼 xghabc 的回复:] [quote=引用 23 楼 feiazifeiazi 的回复:]

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED --指定语句可以读取已由其他事务修改但尚未提交的行
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; --指定语句不能读取已由其他事务修改但尚未提交的数据。 这样可以避免脏读。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ --指定语句不能读取已由其他事务修改但尚未提交的行
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;  
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; --最高级别的事务级别

--请楼主 参才事务级别
使用锁效果最差。。 第一,高峰期,最容易掉失用户数据。。[/quote] 按我的做法,基本不会影响 插入是并发,只是生成id会冲突,但是数据库已经很好解决了 读取和更新,都是单线程、锁单记录,与插入无关[/quote] 其它事务等级都有并发。。[/quote] 记录 任务 不应该涉及其它事务 执行任务才涉及,而执行是由一个线程串行执行的
xghabc 2014-05-14
  • 打赏
  • 举报
回复
引用 29 楼 sz_haitao 的回复:
[quote=引用 27 楼 xghabc 的回复:] [quote=引用 23 楼 feiazifeiazi 的回复:]

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED --指定语句可以读取已由其他事务修改但尚未提交的行
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; --指定语句不能读取已由其他事务修改但尚未提交的数据。 这样可以避免脏读。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ --指定语句不能读取已由其他事务修改但尚未提交的行
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;  
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; --最高级别的事务级别

--请楼主 参才事务级别
使用锁效果最差。。 第一,高峰期,最容易掉失用户数据。。[/quote] 按我的做法,基本不会影响 插入是并发,只是生成id会冲突,但是数据库已经很好解决了 读取和更新,都是单线程、锁单记录,与插入无关[/quote] 其它事务等级都有并发。。
xghabc 2014-05-14
  • 打赏
  • 举报
回复
引用 29 楼 sz_haitao 的回复:
[quote=引用 27 楼 xghabc 的回复:] [quote=引用 23 楼 feiazifeiazi 的回复:]

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED --指定语句可以读取已由其他事务修改但尚未提交的行
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; --指定语句不能读取已由其他事务修改但尚未提交的数据。 这样可以避免脏读。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ --指定语句不能读取已由其他事务修改但尚未提交的行
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;  
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; --最高级别的事务级别

--请楼主 参才事务级别
使用锁效果最差。。 第一,高峰期,最容易掉失用户数据。。[/quote] 按我的做法,基本不会影响 插入是并发,只是生成id会冲突,但是数据库已经很好解决了 读取和更新,都是单线程、锁单记录,与插入无关[/quote] 谁说的。读取和更新都是单线程。。 只有最高级别的事务级别才是单线程的。。
xghabc 2014-05-14
  • 打赏
  • 举报
回复
引用 32 楼 sz_haitao 的回复:
[quote=引用 31 楼 xghabc 的回复:] [quote=引用 29 楼 sz_haitao 的回复:] [quote=引用 27 楼 xghabc 的回复:] [quote=引用 23 楼 feiazifeiazi 的回复:]

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED --指定语句可以读取已由其他事务修改但尚未提交的行
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; --指定语句不能读取已由其他事务修改但尚未提交的数据。 这样可以避免脏读。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ --指定语句不能读取已由其他事务修改但尚未提交的行
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;  
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; --最高级别的事务级别

--请楼主 参才事务级别
使用锁效果最差。。 第一,高峰期,最容易掉失用户数据。。[/quote] 按我的做法,基本不会影响 插入是并发,只是生成id会冲突,但是数据库已经很好解决了 读取和更新,都是单线程、锁单记录,与插入无关[/quote] 其它事务等级都有并发。。[/quote] 记录 任务 不应该涉及其它事务 执行任务才涉及,而执行是由一个线程串行执行的[/quote] 不对。。执行是一个线程执行。。可以是。。是交叉执行。。不是一个事务执行,然后顺序一条一条做。。 也是,一个事务A,A的内容,一个B 事务,B的内容,然后一个A事务A的内容,一个B事务,B的内容。。是交叉执行。。
haitao 2014-05-13
  • 打赏
  • 举报
回复
引用 27 楼 xghabc 的回复:
[quote=引用 23 楼 feiazifeiazi 的回复:]

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED --指定语句可以读取已由其他事务修改但尚未提交的行
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; --指定语句不能读取已由其他事务修改但尚未提交的数据。 这样可以避免脏读。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ --指定语句不能读取已由其他事务修改但尚未提交的行
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;  
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; --最高级别的事务级别

--请楼主 参才事务级别
使用锁效果最差。。 第一,高峰期,最容易掉失用户数据。。[/quote] 按我的做法,基本不会影响 插入是并发,只是生成id会冲突,但是数据库已经很好解决了 读取和更新,都是单线程、锁单记录,与插入无关
xghabc 2014-05-13
  • 打赏
  • 举报
回复
引用 19 楼 sz_haitao 的回复:
[quote=引用 18 楼 xghabc 的回复:] [quote=引用 16 楼 sz_haitao 的回复:] [quote=引用 15 楼 xghabc 的回复:] [quote=引用 14 楼 sz_haitao 的回复:] [quote=引用 10 楼 xghabc 的回复:] [quote=引用 8 楼 sz_haitao 的回复:] 并行转串行嘛 很多进程、线程把要做的事情,并行地写入一个日志表 然后由单一的进程循环读取此表的每一条未作的记录,逐一执行之,即可
是啊。。就是列队啊。。。金额操作。。进行列队执行。。就是没有相关资料学习。。能提供点吗。。[/quote] 没什么特殊的: 建一个 操作队列表 所有需要操作的进程、线程,都并行地往里只增不删改地插入记录,字段为自己需要做的事情的所有信息 单一的进程循环读取此表的每一条未作的记录id(select top 1 fID from tblog where fDone=0 order by fID desc), 根据此记录的字段,执行之, 然后update tblog fDone=1 where fID=刚才的id [/quote] 听说。。用数据库进行列队。。不明智。。[/quote] 如果性能要求极高或有专门的队列中间件,是不该用数据库做队列 但是,既然都只要求串行了,性能显然不是要求很高了[/quote] 不是知道。。有什么队列中间件推荐昵。。[/quote] 队列中间件是专门搞的 有些OS也自带;常见的有MQ;国产的有东方通的。。。。 问题是,如果用数据库了,再与它们交互,可能反而不同全部用数据库[/quote] 是的。。主要。。我还是要支持事务。。就是这个消息队列的状态,SQL语句一起执行。。不要语句执行了,消息列队状态没改变。。
xghabc 2014-05-13
  • 打赏
  • 举报
回复
引用 23 楼 feiazifeiazi 的回复:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED --指定语句可以读取已由其他事务修改但尚未提交的行
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; --指定语句不能读取已由其他事务修改但尚未提交的数据。 这样可以避免脏读。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ --指定语句不能读取已由其他事务修改但尚未提交的行
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;  
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; --最高级别的事务级别

--请楼主 参才事务级别
使用锁效果最差。。 第一,高峰期,最容易掉失用户数据。。
xghabc 2014-05-12
  • 打赏
  • 举报
回复
引用 14 楼 sz_haitao 的回复:
[quote=引用 10 楼 xghabc 的回复:] [quote=引用 8 楼 sz_haitao 的回复:] 并行转串行嘛 很多进程、线程把要做的事情,并行地写入一个日志表 然后由单一的进程循环读取此表的每一条未作的记录,逐一执行之,即可
是啊。。就是列队啊。。。金额操作。。进行列队执行。。就是没有相关资料学习。。能提供点吗。。[/quote] 没什么特殊的: 建一个 操作队列表 所有需要操作的进程、线程,都并行地往里只增不删改地插入记录,字段为自己需要做的事情的所有信息 单一的进程循环读取此表的每一条未作的记录id(select top 1 fID from tblog where fDone=0 order by fID desc), 根据此记录的字段,执行之, 然后update tblog fDone=1 where fID=刚才的id [/quote] 听说。。用数据库进行列队。。不明智。。
haitao 2014-05-12
  • 打赏
  • 举报
回复
引用 10 楼 xghabc 的回复:
[quote=引用 8 楼 sz_haitao 的回复:] 并行转串行嘛 很多进程、线程把要做的事情,并行地写入一个日志表 然后由单一的进程循环读取此表的每一条未作的记录,逐一执行之,即可
是啊。。就是列队啊。。。金额操作。。进行列队执行。。就是没有相关资料学习。。能提供点吗。。[/quote] 没什么特殊的: 建一个 操作队列表 所有需要操作的进程、线程,都并行地往里只增不删改地插入记录,字段为自己需要做的事情的所有信息 单一的进程循环读取此表的每一条未作的记录id(select top 1 fID from tblog where fDone=0 order by fID desc), 根据此记录的字段,执行之, 然后update tblog fDone=1 where fID=刚才的id
xghabc 2014-05-12
  • 打赏
  • 举报
回复
引用 12 楼 hgwyl 的回复:
楼主对“队列”的意思,应该不是属于安全性吧? 而是“即时性”吧? 同一个账户下,客户发起两笔交易(暂时不管如何执行,也许客户故意这样诈骗呢)。 账户余额1万,两笔交易为“支出6千+支出5千”。 队列是为了保证数据的及时性,不会出错吧…… 8#的“并行转串行”,应该可行吧?(虽然我技术也不到家,不会……) 或者在操作账户时,进行“锁死”,操作完成后才允许其他人进行操作。 ——菜鸟只能想到这种笨办法
用锁。。容易报错。。。锁住了,别人操作不行。。就会报错。。
hgwyl 2014-05-12
  • 打赏
  • 举报
回复
楼主对“队列”的意思,应该不是属于安全性吧? 而是“即时性”吧? 同一个账户下,客户发起两笔交易(暂时不管如何执行,也许客户故意这样诈骗呢)。 账户余额1万,两笔交易为“支出6千+支出5千”。 队列是为了保证数据的及时性,不会出错吧…… 8#的“并行转串行”,应该可行吧?(虽然我技术也不到家,不会……) 或者在操作账户时,进行“锁死”,操作完成后才允许其他人进行操作。 ——菜鸟只能想到这种笨办法
黄_瓜 2014-05-12
  • 打赏
  • 举报
回复
好像搞的其它行业都不怕出错一样。
xghabc 2014-05-12
  • 打赏
  • 举报
回复
引用 8 楼 sz_haitao 的回复:
并行转串行嘛 很多进程、线程把要做的事情,并行地写入一个日志表 然后由单一的进程循环读取此表的每一条未作的记录,逐一执行之,即可
是啊。。就是列队啊。。。金额操作。。进行列队执行。。就是没有相关资料学习。。能提供点吗。。
xiaoxiangqing 2014-05-12
  • 打赏
  • 举报
回复
这个是属于高深的问题。
haitao 2014-05-12
  • 打赏
  • 举报
回复
并行转串行嘛 很多进程、线程把要做的事情,并行地写入一个日志表 然后由单一的进程循环读取此表的每一条未作的记录,逐一执行之,即可
加载更多回复(18)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧