锁-select的时候就能开始排他的问题

问题描述

select的时候就能开始排他的问题

用ADO操作sybase的表。其中有一张登陆表。原则上应该只有1条记录
但是两个人同时登陆的时候,因为没有主键,只有姓名所以同时2条数据被登陆进去了

我的做法是
一开始select * from 表 holdlock
但是holdlock后两个人都有读的权限。
然后2个人都发现表里没数据,开始insert
insert的时候排他。一个人insert提交完之后另一个人insert
结果就变成了2条数据。

有没有方法在一个人select的时候就把表给排他。另一个不能同时select
只有当一个人select,insert全操作完了,另一个人才开始select

解决方案

你的脚发痒了,你选择把脚剁掉,然后残废了,没法走路了,问如何能不要残废。这是多么荒谬的事情。
任何数据库的表,不同于excel和word中的表,都必须有一个主键,并且这个主键不要是任何和业务相关的字段(比如姓名),这是起码的常识。
你意识到最初的设计就有问题,你不去解决,而是越绕越复杂。

解决方案二:

你这样子做不是很好的解决方案。数据库在执行update、insert操作的时候本身就是加锁的,查询的时候如果强制性的加锁,比如加上 for update,则别人对表无法操作。

这样的解决方案应该由应用逻辑去处理,而不是直接使用数据库的“锁”来解决。

时间: 2024-10-27 01:57:05

锁-select的时候就能开始排他的问题的相关文章

mysql的行锁与表锁(select* .... FOR UPDATE)

mysql中使用select for update的必须针对InnoDb,并且是在一个事务中,才能起作用. select的条件不一样,采用的是行级锁还是表级锁也不一样. 由于 InnoDB 预设是 Row-Level Lock,所以只有「明确」的指定主键,MySQL 才会执行 Row lock (只锁住被选取的资料例) ,否则 MySQL 将会执行 Table Lock (将整个资料表单给锁住). 举个例子: 假设有个表单 products ,裡面有 id 跟 name 二个栏位,id 是主键.

mysql锁SELECT FOR UPDATE【转】

MySQL 使用SELECT ... FOR UPDATE 做事务写入前的确认 以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式: SELECT ... LOCK IN SHARE MODE SELECT ... FOR UPDATE 这两种方式在事务(Transaction) 进行当中SELECT 到同一个数据表时,都必须等待其它事务数据被提交(Commit)后才会执行.

mysql第二天 锁

如果没有锁,那么并发性会更强,但是数据安全性会有问题.因此数据库会给数据加锁. 共享锁与排他锁 也就是读写锁,共享锁可以叠加共享锁但是不能加排他锁, 排他锁则不能叠加. 根据隔离级别等等,mysql会隐式的给数据自动加锁 此外还可以使用share in model, for update 等语句显示的加锁 粒度锁 粒度越细,维护锁的开销越大,并发性越高,数据越不安全. 通常有如下两种 - 行锁 只给一行数据加锁 - 表锁 给整张表加锁, 一般Alter table会使用表锁 意向锁 mysql为

为什么忘记commit也会造成select查询的性能问题

今天遇到一个很有意思的问题,一个开发人员反馈在测试服务器ORACLE数据库执行的一条简单SQL语句非常缓慢,他写的一个SQL没有返回任何数据,但是耗费了几分钟的时间.让我检查分析一下原因,分析解决过后,发现事情的真相有点让人哭笑不得,但是也是非常有意思的.我们先简单构造一下类似的案例,当然只是简单模拟.   假设一个同事A,创建了一个表并初始化了数据(实际环境数据量较大,有1G多的数据),但是他忘记提交了.我们简单模拟如下: SQL> create table test_uncommit   2

oracle事务和锁(转)

If you use a SET TRANSACTION statement, then it must be the first statement in your transaction. However, a transaction need not have a SET TRANSACTIONstatement. Syntax set_transaction::=   http://docs.oracle.com/cd/B28359_01/server.111/b28286/statem

SQL Server Insert操作中的锁

原文:SQL Server Insert操作中的锁     这篇博文简单介绍一下在SQL Server中一条Insert语句中用到的锁. 准备数据     首先我们建立一张表Table_1,它有两列Id(bigint)和Value(varchar),其中Id建立了主键. CREATE TABLE [dbo].[Table_2]( [Id] [bigint] NOT NULL, [Value] [nchar](10) NULL, CONSTRAINT [PK_Table_2] PRIMARY KE

Oracle 数据库针对表主键列并发导致行级锁简单演示_oracle

本文内容 •软件环境 •简单演示 Oracle 数据库并发导致行级锁 本文简单演示针对表主键并发导致的行级锁.并发是两个以上的用户对同样的数据进行修改(包括插入.删除和修改).锁的产生是因为并发.没有并发,就没有锁.并发的产生是因为系统需要,系统需要是因为用户需要. 软件环境 -------------------------------------------------------------------------------- •Windows 2003 Server •Oracle 1

为什么忘记commit也会造成select查询的性能问题(SELECT产生Redo的情形)

为什么忘记commit也会造成select查询的性能问题(SELECT产生Redo的情形) 1.延迟库块清除 2.recursive calls中有产生REDO的情况   Oracle什么情况下select会产生redo ?   1`)快速块清除或者叫commit cleanout.事务提交的时候,oracle针对内存里的块 1)把数据块ITL  ENTRY里flag的标记为U 2)设置commit scn在Scn/Fsc列.有了两个标记就可以告诉全世界这个事务已经提交.但ITL ENTRY 的

擦亮自己的眼睛去看SQL Server之谈谈锁机制

在谈谈SQL Server的锁机制之前,来思考以下这个场景:当你在酷暑的时候骑着自己的小车往目的地行走时,路上连续遇到几个时间很长的红灯,是不是很郁闷?有时候 你可能实在受不了闯了个红灯,其实在大部分情况下问题不大,如果通行的汽车很多那就不好说了.因为不遵守规则的人太多,都为了达到目的去走捷径,不愿意等 待.这样才有了交警.交警的作用就是维护这些红绿灯的规则.这些红绿灯就像锁一样,锁住或延长你去目的地的时间.但是如果没有交警大家又不自由遵守红绿灯 规则会导致什么呢?大家想想都知道. 这个系列的一