高并发下数据库中如何解决重复插入数据的问题

昨天面试,被面试官问到。。。
比如用户注册时,先要验证用户名是否存在,但是在验证过后可能还会被插入相同用户名的数据,这就造成了冲突。
应该怎么解决?

6个回答

验证的同时,将用户名插入一个临时表,下一个用户验证时要与临时表数据一并比对,用户注册完成后删除临时表的当条记录

EvilSlyvanas
一只笨鸟丶 不太清楚你的表述,我觉得比对就会用到select,则就会出现同步的问题,除非你的临时表的用户名定义了唯一约束,用insert的成功和失败来判断,因为事务的级别问题,insert会锁表,所以可以用来判断。当然,这样的处理还不如在原来的表上设置唯一约束
2 年多之前 回复
tesily
菜鸟欧少 回复Mr_Manco: 不好意思,有段时间没上了。删除临时表的时间,必须是用户保存或取消保存。如果保存了,那么这个用户名已经在数据库中存在,又有新用户注册时,需要比较数据库的正式数据和临时数据。如果取消了,那么就不用考虑这个问题了,再有用户注册时,又重复之前的比较流程。
2 年多之前 回复
Mr_Manco
Mr_Manco 我是菜鸟小白 用户注册完成后删除临时表的当条数据 之后再注册有重复的用户名怎么办 这是临时表的数据已经没有了 怎么比较?
接近 3 年之前 回复

设置唯一索引(用户名)

EvilSlyvanas
一只笨鸟丶 回复菜鸟欧少: 保存的时候报错若你可以抓取对应的异常则可以知道是用户名有没有被占用了。
2 年多之前 回复
tesily
菜鸟欧少 唯一索引只能在保存的时候报错,不能反应此用户名没被占用
接近 3 年之前 回复

楼主,想知道这个验证用户名是否存在,然后还要去插入重复数据的业务场景是啥,为什么会有这样的需求呢?

qq_36271806
爱吃火锅的S 回复旋葎: 好的,明白了 谢谢
2 年多之前 回复
jkl012789
旋葎 老铁 你先验证了用户名不存在, 验证完成后在其他的用户那边刚好这时候也在验证这个用户名,也是不存在,他比你先注册完成,那这时候你再去点击注册,因为你已经校验不存在此用户名,所以你也会注册成功,这时候会出现重复的用户名。
接近 3 年之前 回复

做事务处理,将判断、插入两个动作写在一个事务中

写在同一个事务其实也不能解决重复的问题 主要是设置唯一索引 相同用户名的时候 数据库自然会回滚后插入的

1、程序层面,设置单线程,线程内包含select重复校验和保存方法。这样第二个指令必须等到第一个指令执行完毕才执行。这样的好处是效果是绝对的,
但是极大并发下,效率低。
2、数据库层面。这就是乐观锁和悲观所了。
当验证用户的时候,如果数据库内有。直接返回。如果数据库内没有,则插入这条用户信息(也可以用临时表的方式),但是用户状态是无效,并将本条数据枷锁,而如果用本
用户进行注册的时候,其实是直接修改用户的状态变为有效。
所谓悲观所就是直接对这条信息for update,谁都不能用,就当前这个事物能用。
所谓乐观锁就是插入以后返回一个版本号。
接下来,如果有其他的用户也用这个用户名了。那版本号就加1,那就是看你俩谁快了。如果你点保存。的时候发现你的版本号小于数据库的版本号。
那你就要重新获取一个版本号,如果发现不小于,那这个用户名就是你的。如果发现已经生效了。那用户就是别人的了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
多用户高并发插入数据怎么解决并发问题

场景: 类似银行存取,增减账户余额,但是多了明细表,每次转账更新用户同一条数据记录,但是用户明细表一直递增信息记录,关键字段为当前余额(操作金额加上原余额得出) 问题: 更新同一条记录可以通过增加version字段解决高并发同时写的问题 但是明细表中先读取原先余额再写入新余额,这个怎么解决,怎么能让每次读出余额是最新的,写入明细之前余额不会被修改

java关于并发查询数据库的问题

java关于并发查询数据库的问题 问题如下 1,从数据库查询2条数据 2,循环2条数据请求第三方接口(耗时)(每条数据只能请求3次第三方接口) 3,请求成功则修改该条数据(请求第三方的次数+1)。 现在的问题是 并发情况下,两个线程同时进来,取到2条数据(已经请求过第三方接口两次) 这时候两个线程同时再去请求第三方接口,得到的结果就只会有一个成功。因为另一个已经达到3次了。 这种问题应该怎么解决???

求 有关 高并发 数据区 读取更新 数据 的解决办法

问题:高并发 数据库取数据,每次取到一条数据后更新这条数据的状态为已取用过。 环境:3台服务器跑应用 处理请求,多线程数据库取数据 有点类似 12306的买票,查找过资料 有看到 1W人 同时抢一张票的问题。 现在考虑的问题是,如果票是足够多的,如何解决高并发取数据冲突的问题,如果用加锁的方式,会出现大量请求都取一条数据,导致 等待时间太长。 有没有 好的方案,可以避免同时请求到同一条数据。

数据库 高并发 脏读 多线程

问题一 对于项目中一些对数据库的插入操作,每次插入一条两条,但是频繁,是应该没次请求插入数据时就对数据库直接进行插入操作,还是等到了一定的量对数据库进行一次批量操作。还有就是如果想对数据库进行批量操作,那么之前对的那些插入请求往哪里放,就是之前他请求插入,我肯定要把它存起来,然后在一次性插入,就是这个存起来的步骤是怎么处理的,最好用java 问题二 现在库存里只有一千件商品,同时有一万个人下单,下单那部分代码采用了加锁机制,导致了系统很卡,如过不加锁的话,那么可能会出现只有一千件商品,却有五千人下了单,怎么解决

高并发下数据库服务器CPU使用率问题

最近在做数据库的性能测试,发现一个奇怪的现象,当并发数在两百以内的时候,数据库服务器的CPU使用率为70%多,数据库服务器的CPU是40个,每个CPU的使用率都很平均。当并发量达到一千的时候,数据库服务器的使用率只有30%多,并且发现40个CPU中只有一个CPU一直保持高使用率的状态,剩下的39个使用率都很低。请问一下各位大神,是不是因为那个比较高使用率的CPU正在调度并发线程,其他的CPU在等待而导致的使用率不高呢?还有什么其他的原因可以解释这个现象吗?

高并发情况下怎么避免数据重复

数据库有一字段:orderNo,orderNo的规则:20170327000001、20170327000002依次往后累加。。。并发时怎么避免存入重复的

解决数据库并发问题

update A set A.id=1 where A.name='zw' ----1 update A set A.id=2 where A.name='zw' ----2 我想实现在修改语句一的时候,语句二不能执行.请各位大哥给点建议吧.谢谢了.说详细一点.小弟万分感激. [b]问题补充:[/b] sybase数据库 create table abc( cat_id int not null, section_id varchar(10) not null, attr_id varchar(10) not null, key_attr_seq int not null, constraint a primary key(cat_id,section_id,attr_id) ) alter table abc add rid int identity alter table abc lock [datarows] --加入行级锁 计算机A: begin tran select * from abc waitfor delay '00:00:20' commit tran 计算机B:update abc set section_id='999' where rid=5 请问为何在A运行时机B仍然能修改表abc的数据呢 我想实现在A运行上面SQL时其它进程只能查看,不能更新A查询出来的数据. 谢谢. [b]问题补充:[/b] 数据库表abc已经写死了,不能随意的添加字段. [b]问题补充:[/b] 好象不行哦.constraint a primary key(cat_id,section_id,attr_id) 是复合主键盘,不行的.更新的是key_attr_seq 字段. [b]问题补充:[/b] key_attr_seq 字段是在UI上用户更新的字段.所以不能把它作为一个标识字段随意增加.能否给我提供怎么加锁呀.加哪种锁比较好.谢谢. [b]问题补充:[/b] 恩,我试试.除了这种方法还有其它的办法吗.比如数据库的隔离级别或者加锁之类的. [b]问题补充:[/b] 恩,十分感谢.

在使用laravel插入数据之前检查数据库并避免重复

<div class="post-text" itemprop="text"> 我试图在插入数据之前检查数据库以避免重复。 我将URL存储在数组中,然后将这些URL插入表的“链接”列中。 所以首先我要检查该列,是否设置相同的URL? 如果不是,则使用此代码插入数据。 这是我完整的数据库插入代码: <pre><code>foreach ($outlineUrls as $outlineUrl) { $html = file_get_contents($outlineUrl); $DOMParser = new \DOMDocument(); $DOMParser-&gt;loadHTML($html); $changeForMyDB = [ 'remote_id' =&gt; '', 'region' =&gt; '関西', 'link' =&gt; json_encode($outlineUrl), 'name' =&gt; '', 'price' =&gt; '', 'extend' =&gt; '', 'address' =&gt; '', 'hows_old' =&gt; '', 'rooms' =&gt; '', 'old' =&gt; '', 'entery' =&gt; '', 'balcon_m2' =&gt; '', 'company_name' =&gt; '', 'script_from' =&gt; '' ]; $allPTags = $DOMParser-&gt;getElementsByTagName('p'); foreach($allPTags as $ptag){ if($ptag-&gt;getAttribute('class') == 'c-name'){ $changeForMyDB['name'] = trim($ptag-&gt;nodeValue); } } $changeForMyDB['address'] = trim($DOMParser-&gt;getElementsByTagName('dd')[0]-&gt;nodeValue); $allTables = $DOMParser-&gt;getElementsByTagName('table'); foreach($allTables as $table){ foreach($table-&gt;getElementsByTagName('tr') as $tr){ $property = trim($tr-&gt;getElementsByTagName('th')[0]-&gt;nodeValue); $value = trim($tr-&gt;getElementsByTagName('td')[0]-&gt;nodeValue); switch ($property) { case '物件名': $changeForMyDB['name'] = $value; break; case '販売価格': $changeForMyDB['price'] = $value; break; case '専有面積': $changeForMyDB['extend'] = $value; break; case '所在地': $changeForMyDB['address'] = $value; break; case '総戸数': $changeForMyDB['hows_old'] = $value; break; case '間取り': $changeForMyDB['rooms'] = $value; break; case '竣工時期': $changeForMyDB['old'] = $value; break; case '管理会社': $changeForMyDB['company_name'] = $value; break; case '入居時期': $changeForMyDB['entery'] = $value; break; case '入居時期': $changeForMyDB['entery'] = $value; break; case 'バルコニー面積': $changeForMyDB['balcon_m2'] = $value; break; default: # code... break; } } } if(Estates::where('link','=',$outlineUrl)-&gt;count() &gt; 0) { $this-&gt;error('There is link.'); } else { Estates::insertGetId($changeForMyDB); $this-&gt;line('Data saved.'); } </code></pre> <p>但问题就在这里。它没有检查就插入了数据! 你知道是什么问题吗?谢谢你的帮助。 </p> </div>

informix数据库表主键重复,数据插入失败。怎么解决?在线急等!!!!

informix数据插入出现主键重复。怎么可以更好地解决这类问题?

一个关于数据库级别的并发问题

**需求**:流水表的订单号对于交易A是允许重复的,但是对于交易B是不允许重复的。程序需要部署负载均衡。 **设计**: 交易A可以直接插入数据库 交易B需要先根据订单号去数据库查询下有没有这条数据,没有才执行插入 **问题**: 如果B交易有并发请求的时候(订单号相同)查的时候是没有数据但是查询完之后另一个并发请求插入了数据,然后这个查询的也插入了数据,那就会造成B交易在数据库有重复订单号的情况。 ![图片说明](https://img-ask.csdn.net/upload/201701/20/1484925735_754667.png)

数据库在数据导入时的并发问题(使用myBatis)

我有一个批量导入数据到数据库中的程序,代码主要做2件事情. 1.首先检查数据库中有无重复记录.如果有则返回false,不进行导入操纵. 2.没有重复数据,则导入这批数据. 现在我有这样一个疑问,当我做完检查的时候,系统发现没有重复,于是执行下面的导入操作. 可当我还没提交这批数据时,另一个系统修改了数据库,导致出现重复记录,也就是说出现了数据不一致的问题. 明明在检查的时候没有重复,可在提交的时候出现重复.象这种问题应该怎么解决,或者此类问题的解决思路是怎样的? 是在检查数据有无重复时就锁住整张表?如果要锁表,myBatis里应该怎么做呢?

java多线程高并发下的oracle数据库异常

代码的功能是生成一个随机的序列化的订单号,正常的情况下一个一个跑没问题,在进行压力测试的时候,多线程高并发下,oracle的create语句就会报错,说是 java.lang.RuntimeException: org.springframework.jdbc.BadSqlGrammarException: ConnectionCallback; bad SQL grammar []; nested exception is java.sqlSQLException: ORA-00955: 名称已由现有对象使用 求大神看下。 代码如下: ``` package utils.spring; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.ConnectionCallback; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCallback; import org.springframework.stereotype.Component; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; import utils.Lang; import javax.sql.DataSource; import java.sql.*; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * 序列发生器(可用于高并发、可回收等场景) * * @author lujijiang * */ @Component @ConfigurationProperties(prefix = "seqGenerator") final public class SequenceGenerator implements InitializingBean { interface Atom<T> { T atom(Connection connection) throws Exception; } public static <T> T atom(Connection connection, Atom<T> atom) throws Exception { connection.setAutoCommit(false); connection .setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); try { T obj = atom.atom(connection); connection.commit(); return obj; } catch (Exception e) { connection.rollback(); throw e; } } static Map<String, String> createSqlMap = new ConcurrentHashMap<String, String>(); static { createSqlMap .put("h2", "CREATE TABLE %s (v$key BIGINT NOT NULL,v$key$ varchar(256),v$seq BIGINT NOT NULL,v$state CHAR(1) NOT NULL, PRIMARY KEY (v$key,v$seq))"); createSqlMap .put("mysql", "CREATE TABLE %s (v$key BIGINT NOT NULL,v$key$ varchar(256),v$seq BIGINT NOT NULL,v$state CHAR(1) NOT NULL, PRIMARY KEY (v$key,v$seq))"); createSqlMap .put("informix", "CREATE TABLE %s (v$key DECIMAL(16,0) NOT NULL,v$key$ varchar(256),v$seq DECIMAL(16,0) NOT NULL,v$state CHAR(1) NOT NULL, PRIMARY KEY (v$key,v$seq))"); createSqlMap .put("oracle", "CREATE TABLE %s (v$key NUMBER(16,0) NOT NULL,v$key$ varchar2(256),v$seq NUMBER(16,0) NOT NULL,v$state CHAR(1) NOT NULL, PRIMARY KEY (v$key,v$seq))"); } static Map<String, String> insertSqlMap = new ConcurrentHashMap<String, String>(); static { insertSqlMap .put("h2", "insert into %s(v$key,v$key$,v$seq,v$state) values(%d,'%s',(select ifnull(max(t.v$seq),%d)+%d from %s t where t.v$key=%d),'1')"); insertSqlMap .put("mysql", "insert into %s(v$key,v$key$,v$seq,v$state) values(%d,'%s',(select ifnull(max(t.v$seq),%d)+%d from %s t where t.v$key=%d),'1')"); insertSqlMap .put("informix", "insert into %s(v$key,v$key$,v$seq,v$state) values(%d,'%s',(select nvl(max(t.v$seq),%d)+%d from %s t where t.v$key=%d),'1')"); insertSqlMap .put("oracle", "insert into %s(v$key,v$key$,v$seq,v$state) values(%d,'%s',(select nvl(max(t.v$seq),%d)+%d from %s t where t.v$key=%d),'1')"); } /** * 事务模版 */ TransactionTemplate transactionTemplate; /** * 是否使用新事务 */ boolean newTransaction = true; /** * JDBC模版 */ JdbcTemplate jdbcTemplate; /** * 尝试次数(默认10次) */ int tryTime = 10; /** * 数据库类型 */ String databaseType; /** * 表名 */ private String tableName; /** * 容量 */ private int capacity = 25; /** * 步进 */ private int step = 1; /** * 是否可回收序列号 */ protected boolean recyclable; @Autowired public void setTransactionManager( PlatformTransactionManager transactionManager) { if (transactionManager != null) { transactionTemplate = new TransactionTemplate(transactionManager); transactionTemplate .setIsolationLevel(TransactionTemplate.ISOLATION_READ_COMMITTED); transactionTemplate .setPropagationBehavior(TransactionTemplate.PROPAGATION_REQUIRED); } } public boolean isNewTransaction() { return newTransaction; } public void setNewTransaction(boolean newTransaction) { this.newTransaction = newTransaction; } public TransactionTemplate getTransactionTemplate() { return transactionTemplate; } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Autowired public void setDataSource(DataSource dataSource) { if (jdbcTemplate == null) { jdbcTemplate = new JdbcTemplate(dataSource); } } public void setTransactionTemplate(TransactionTemplate transactionTemplate) { this.transactionTemplate = transactionTemplate; } public void setTryTime(int tryTime) { this.tryTime = tryTime; } public void setDatabaseType(String databaseType) { if (databaseType != null) { databaseType = databaseType.trim().toLowerCase(); this.databaseType = databaseType; } } public void setTableName(String tableName) { this.tableName = tableName == null ? null : tableName.trim(); } public void setCapacity(int capacity) { this.capacity = capacity; } public void setStep(int step) { this.step = step < 1 ? 1 : step; } public void setRecyclable(boolean recyclable) { this.recyclable = recyclable; } /** * 创建序列 * * @param name * @param length * @param start * @return */ public String generateSequence(String name, int length, long start) { final long key = generateKey(name); try { return generateSequence(key, length, start, name); } catch (Throwable t) { createSequenceTable();//错误就是定位在这里 int time = tryTime >= 0 ? tryTime : 10000; while (time-- > 0) { try { return generateSequence(key, length, start, name); } catch (Throwable e) { } } throw new RuntimeException("Generate sequence failure", t); } } private long generateKey(String name) { return 10000000000L + name.trim().hashCode(); } /** * 创建序列 * * @param key * @param length * @return */ public String generateSequence(String key, int length) { return generateSequence(key, length, 0); } /** * 创建序列 * * @param key * @return */ public String generateSequence(String key) { return generateSequence(key, 6); } private synchronized void createSequenceTable() { try { jdbcTemplate.execute(new ConnectionCallback<Integer>() { public Integer doInConnection(Connection connection) throws SQLException, DataAccessException { ResultSet rs = connection.getMetaData().getTables(null, null, tableName, null); try { while (rs.next()) { return 1; } } finally { rs.close(); } String createSql = String.format( createSqlMap.get(databaseType), tableName); Statement statement = connection.createStatement(); try { statement.execute(createSql);//错误就是定位在这里 } finally { statement.close(); } return 0; } }); } catch (Throwable t) { throw new RuntimeException(t); } } private String generateSequence(final long key, final int length, final long start, final String name) { if (newTransaction) { try { Connection connection = jdbcTemplate.getDataSource() .getConnection(); try { return atom(connection, new Atom<String>() { @Override public String atom(Connection connection) throws Exception { if (recyclable) { String no = getRecoveredSequence(connection, key, length); if (no != null) { return no; } } Statement statement = connection.createStatement(); try { String insertSql = String.format(insertSqlMap .get(databaseType), tableName, key, name.replace("'", "''"), start < 0 ? 0 : start, step, tableName, key); execute(connection, insertSql); String querySql = String .format("select max(v$seq) from %s where v$key=%d and v$state='1'", tableName, key); ResultSet rs = statement.executeQuery(querySql); try { while (rs.next()) { Long max = rs.getLong(1); if (max < start) {// 重新初始化 String deleteSql = String .format("delete from %s where v$key=%d and v$state='1'", tableName, key); execute(connection, deleteSql); insertSql = String.format( insertSqlMap .get(databaseType), tableName, key, name.replace("'", "''"), start < 0 ? 0 : start, step, tableName, key); execute(connection, insertSql); return fillLeftZero(start, length); } if (capacity > 0 && max % capacity == 0) { String deleteSql = String .format("delete from %s where v$key=%d and v$seq<>%d and v$state='1'", tableName, key, max); execute(connection, deleteSql); } return fillLeftZero(max, length); } } finally { rs.close(); } } finally { statement.close(); } throw new IllegalStateException( SequenceGenerator.this.getClass() .getSimpleName() + "无法获取单号,不可能发生的异常"); } }); } finally { connection.close(); } } catch (Exception e) { throw Lang.unchecked(e); } } return getTransactionTemplate().execute( new TransactionCallback<String>() { public String doInTransaction(TransactionStatus ts) { try { if (recyclable) { String no = jdbcTemplate .execute(new ConnectionCallback<String>() { public String doInConnection( Connection connection) throws SQLException, DataAccessException { return getRecoveredSequence( connection, key, length); } }); if (no != null) { return no; } } String insertSql = String.format(insertSqlMap .get(databaseType), tableName, key, name .replace("'", "''"), start < 0 ? 0 : start, step, tableName, key); execute(insertSql); String querySql = String .format("select max(v$seq) from %s where v$key=%d and v$state='1'", tableName, key); Long max = jdbcTemplate.queryForObject(querySql, Long.class); if (max < start) {// 重新初始化 String deleteSql = String .format("delete from %s where v$key=%d and v$state='1'", tableName, key); execute(deleteSql); insertSql = String.format(insertSqlMap .get(databaseType), tableName, key, name.replace("'", "''"), start < 0 ? 0 : start, step, tableName, key); execute(insertSql); return fillLeftZero(start, length); } if (capacity > 0 && max % capacity == 0) { String deleteSql = String .format("delete from %s where v$key=%d and v$seq<>%d and v$state='1'", tableName, key, max); execute(deleteSql); } return fillLeftZero(max, length); } catch (Throwable t) { ts.isRollbackOnly(); throw new RuntimeException(t); } } }); } /** * 参数化执行SQL * * @param sql * @param args * @return */ protected int execute(String sql, final Object... args) { return jdbcTemplate.execute(sql, new PreparedStatementCallback<Integer>() { public Integer doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException { if (args != null) { for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } } return ps.executeUpdate(); } }); } /** * 参数化执行SQL * * @param sql * @param args * @return * @throws SQLException */ protected int execute(Connection conn, String sql, final Object... args) throws SQLException { PreparedStatement ps = conn.prepareStatement(sql); try { if (args != null) { for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } } return ps.executeUpdate(); } finally { ps.close(); } } protected String fillLeftZero(Long max, int length) { StringBuilder sb = new StringBuilder(); sb.append(max); if (sb.length() >= length) { return sb.substring(sb.length() - length); } else { for (int i = sb.length(); i < length; i++) { sb.insert(0, '0'); } } return sb.toString(); } /** * 获取已回收的序列 * * @param connection * @param key * @throws SQLException */ protected String getRecoveredSequence(Connection connection, long key, int length) throws SQLException { Statement statement = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); try { String querySql = String .format("select v$key,v$seq,v$state from %s where v$key = %d and v$state<>'1' for update", tableName, key); statement.executeQuery(querySql); querySql = String .format("select v$key,v$seq,v$state from %s where v$key = %d and v$state<>'1' order by v$seq asc", tableName, key); ResultSet rs = statement.executeQuery(querySql); try { while (rs.next()) { try { Long min = rs.getLong(2); rs.updateString(3, "1"); rs.updateRow(); return fillLeftZero(min, length); } catch (Throwable ex) { } } } finally { rs.close(); } } finally { statement.close(); } return null; } /** * 回收序列号 * * @param name * @param sequence */ public void recoveredSequence(final String name, final String sequence) { final long key = generateKey(name); final long seq = Long.valueOf(sequence); if (newTransaction) { try { Connection connection = jdbcTemplate.getDataSource() .getConnection(); try { atom(connection, new Atom<Object>() { public Object atom(Connection connection) throws Exception { String updateSql = String .format("update %s set v$state='0' where v$key=%d and v$seq=%d", tableName, key, seq); int count = execute(connection, updateSql); if (count == 0) { String insertSql = String .format("insert into %s(v$key,v$key$,v$seq,v$state) values(%d,'%s',%d,'0')", tableName, key, name.replace("'", "''"), seq); execute(connection, insertSql); } return null; } }); connection.commit(); } finally { connection.close(); } } catch (Exception e) { throw Lang.unchecked(e); } } else { transactionTemplate.execute(new TransactionCallback<Integer>() { public Integer doInTransaction(TransactionStatus status) { try { String updateSql = String .format("update %s set v$state='0' where v$key=%d and v$seq=%d", tableName, key, seq); int count = execute(updateSql); if (count == 0) { String insertSql = String .format("insert into %s(v$key,v$key$,v$seq,v$state) values(%d,'%s',%d,'0')", tableName, key, name.replace("'", "''"), seq); execute(insertSql); } return null; } catch (Throwable t) { status.isRollbackOnly(); throw new RuntimeException(t); } } }); } } public void afterPropertiesSet() throws Exception { if (this.databaseType == null) { throw new IllegalArgumentException(String.format( "Property '%s' is required", "databaseType")); } if (databaseType != null) { if (!createSqlMap.containsKey(databaseType)) { throw new IllegalStateException(String.format( "Unsupported database type:%s", databaseType)); } } if (this.jdbcTemplate == null) { throw new IllegalArgumentException(String.format( "Property '%s' or '%s' is required", "dataSource", "jdbcTemplate")); } if (this.tableName == null) { throw new IllegalArgumentException(String.format( "Property '%s' is required", "tableName")); } if (!tableName.matches("[a-zA-Z_][a-zA-Z0-9_]*") || tableName.length() > 16) { throw new IllegalStateException(String.format( "Illegal tableName:%s", tableName)); } if (!this.newTransaction) { if (this.transactionTemplate == null) { throw new IllegalArgumentException(String.format( "Property '%s' is required", "transactionManager")); } } } } ``` java.lang.RuntimeException: org.springframework.jdbc.BadSqlGrammarException: ConnectionCallback; bad SQL grammar []; nested exception is java.sql.SQLException: ORA-00955: 名称已由现有对象使用 at utils.spring.SequenceGenerator.createSequenceTable(SequenceGenerator.java:272) at utils.spring.SequenceGenerator.generateSequence(SequenceGenerator.java:202) at utils.spring.SequenceGenerator.generateSequence(SequenceGenerator.java:227) at cart.service.service.OrderService.generateOrderNo(OrderService.java:806) at cart.service.service.OrderService.saveVirtualGoodsToOrder(OrderService.java:220) at cart.service.service.OrderService$$FastClassBySpringCGLIB$$19f99be7.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) at cart.service.service.OrderService$$EnhancerBySpringCGLIB$$feb8eef.saveVirtualGoodsToOrder(<generated>) at cart.service.apiImpl.OrderMainApiImpl.saveVirtualGoodsToOrder(OrderMainApiImpl.java:223) at cart.service.apiImpl.OrderMainApiImpl$$FastClassBySpringCGLIB$$fa3518e.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:651) at cart.service.apiImpl.OrderMainApiImpl$$EnhancerBySpringCGLIB$$497f044.saveVirtualGoodsToOrder(<generated>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.weibo.api.motan.rpc.DefaultProvider.invoke(DefaultProvider.java:57) at com.weibo.api.motan.rpc.AbstractProvider.call(AbstractProvider.java:47) at com.weibo.api.motan.filter.AccessLogFilter.filter(AccessLogFilter.java:56) at com.weibo.api.motan.protocol.support.ProtocolFilterDecorator$2.call(ProtocolFilterDecorator.java:150) at utils.rpc.motan.filter.OpenEntityManagerInMotanFilter.filter(OpenEntityManagerInMotanFilter.java:171) at com.weibo.api.motan.protocol.support.ProtocolFilterDecorator$2.call(ProtocolFilterDecorator.java:150) at com.weibo.api.motan.transport.ProviderMessageRouter.call(ProviderMessageRouter.java:96) at com.weibo.api.motan.transport.ProviderProtectedMessageRouter.call(ProviderProtectedMessageRouter.java:79) at com.weibo.api.motan.transport.ProviderMessageRouter.handle(ProviderMessageRouter.java:91) at com.weibo.api.motan.transport.support.DefaultRpcHeartbeatFactory$HeartMessageHandleWrapper.handle(DefaultRpcHeartbeatFactory.java:82) at com.weibo.api.motan.transport.netty.NettyChannelHandler.processRequest(NettyChannelHandler.java:139) at com.weibo.api.motan.transport.netty.NettyChannelHandler.access$000(NettyChannelHandler.java:47) at com.weibo.api.motan.transport.netty.NettyChannelHandler$1.run(NettyChannelHandler.java:116) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: org.springframework.jdbc.BadSqlGrammarException: ConnectionCallback; bad SQL grammar []; nested exception is java.sql.SQLException: ORA-00955: 名称已由现有对象使用 at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:99) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:360) at utils.spring.SequenceGenerator.createSequenceTable(SequenceGenerator.java:247) ... 39 more Caused by: java.sql.SQLException: ORA-00955: 名称已由现有对象使用 at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745) at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:210) at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:961) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1190) at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1726) at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1696) at utils.spring.SequenceGenerator$1.doInConnection(SequenceGenerator.java:264) at utils.spring.SequenceGenerator$1.doInConnection(SequenceGenerator.java:247) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:353) ... 40 more

数据库高并发,用php程序编写的网站怎么解决

因为数据库高并发导致网页延迟或打不开 现在每秒的高并发值是2万 应该怎么解决

怎样避免插入的数据重复??

表结构如下: id name sid 1 aaa 1 2 aaa 2 3 bbb 3 4 bbb 4 5 ccc 5 id是主键。 sid是递增并且唯一的,但不是主键。 现有程序的做法是先select查询出最大得sid 然后在程序里加1,在insert插入数据库。 如果并发查询,再插入,sid就可能重复。有什么办法避免这种情况发生??? (数据库隔离级别设置的方法就不要考虑了。select加for update好像也不适用。) by the way insert into 表(table_name) values (select....)这种方式和上边说的那种方式一样吗???

.net高并发数据的处理

如果大量用户同时并发,或者说同时操作某一个数据的时候,如何保持数据的一致性,请大佬给一个研究的方向。 分布式事务和消息列队 能否解决这个问题呢

php foreach循环插入数据反馈每次重复

<div class="post-text" itemprop="text"> <p>this is my php code. hire is a problem i use check box selection and insert data in my database. but it insert data by foreach loop. so when press ok if data successfully insert then for 3 selection it say</p> <p><strong>successfully register successfully register successfully register</strong> but i want it say only once successfully register</p> <pre><code>&lt;?php $db=require "script_database/connect.php"; $query = "SELECT * FROM course"; $query1="select * from selection where student_id='1229CSE00241' and semester='FALL2015' "; $key=mysql_query($query1); if(mysql_num_rows($key)&gt;0) { echo "you already selected courses for registration"; } else if($_POST['buy']==''){ echo "&lt;h2&gt;&lt;center&gt;You didn't select any courses&lt;/h2&gt;&lt;/center&gt;"; } else{ foreach($_POST['buy'] as $item) { $query = "SELECT * FROM course WHERE id = $item "; if ($r = mysql_query($query)) { while ($row = mysql_fetch_array($r)) { $student_id="1229CSE00241"; $id=$item; $course_id=$row['course_id']; $course_title=$row['course_title']; $course_credits=$row['course_credits']; $course_status=$row['course_status']; $semester="FALL2015"; } } else { print '&lt;p style="color: blue"&gt;Error!&lt;/p&gt;'; } { $insert_query="insert into selection(student_id,semester,course_id,course_title,course_credits,course_status,date_time) values ('$student_id','$semester','$course_id','$course_title','$course_credits','$course_status',NOW())"; } //here is my problem //it repeat every time when insert data but i want to make it only once if(mysql_query($insert_query)) { echo "successfully register"; } else echo "problem show"; } }?&gt; </code></pre> </div>

关于mysql数据库memory表数据重复问题

PHP+MYSQL项目 要实现一个预约功能,我的实现方式是把当天的预约提取出来存入一个memory类型的表,一般情况下一千条左右数据。 然后每次访问时对这个表进行查询此时刻向前推五分钟内,有无未执行的预约之后执行。如执行成功则进行相应的标记。 每次查询前会检查是否有当天的数据,如果没有,则对表进行清空操作。然后从其他表把当天数据查询出来插入memory类型的表。 相关代码大概为: [code="php"] //查询今天的数据条数: $forday = strtotime(date("Y-m-d", $timestamp)); $havefresh = $DB->result("SELECT COUNT(`id`) FROM ".tname('freshtmp')." WHERE `forday` = $forday"); if (empty($havefresh)) {   //此条语句清空数据表   $DB->query("TRUNCATE TABLE ".tname('freshtmp')); //此处为从其他表查询出数据并组合成:$txt = (1,2,3,4),(1,2,3,4)......这样的格式 $DB->query("INSERT INTO ".tname('freshtmp')." (`houseid`, `uid`, `freshtime`, `forday`, `fangan`, `addtime`) VALUES $txt");//此处一般会一次性插入2000条左右的数据 } else { //执行相应刷新操作 } [/code] 我的问题是: 就上面这段代码,经常出现数据重复插入的情况,明明只有2000条数据,结果经常会出现表里成倍的插入数据,变成4000条或六千条。而且通过我记录的插入时间来看,几批数据多是相差一两秒。我分析可能是由于网站并发较大,第一次的语句没有执行成功时在间隔时间内另一个请求又执行了插入代码。 但又实在想不出好的解决办法,特来请教,万分感谢! ----区分下面的广告

[并发]判断条件同时插入数据

业务逻辑: 两个老师在同一或交叉时间段内在同一教室开课,只能有一个老师开课成功, 虽然在插入开课数据前,做了代码层面的判断,但通过压测,仍不能有效避免并发开课成功的结果,请问各位有没有一种有效的解决方案? ``` //判断教室是否占用 if (class_update_status == 1) { boolean canUse = classroomCanUse(class_id, startInputDate, endInputDate); //教室不可用 if (!canUse) { return ResultBean.setOk(1, "添加课时失败,该时间段此教室已被占用,请预约其他教室"); } } int i = lessonPeriodMapper.insertPeriod(period); //添加直播课时成功 if (i > 0) { int new_period_id = period.getPeriod_id(); int seconds=(int)((endTime- System.currentTimeMillis())/1000); redisUtils.setex(new_period_id + "_ossurl",seconds,oss_path); map.put("period_id", new_period_id); updateProgressPriodNumber(lesson_id); return ResultBean.setOk(0, "添加直播课时成功", map); } ``` ![图片说明](https://img-ask.csdn.net/upload/201910/23/1571798878_610645.png) 开启100个并发线程 当执行延迟为1s时候并不会出现并发插入多条成功的情况,延迟为0s时候最多出现并发插入成功5条,实际场景虽然出现延迟0s的几率很少,但仍不能根本解决问题.

最近开发,发现数据库时不时的会出现一些重复的数据,还望大佬指点

最近在开发过程中遇到的问题,不得其解,特想高手求证 <br/>业务描述:添加一条故障记录。我们这个是个物联网项目,这些故障记录是由一个小盒子发送过来的。有个当前故障记录表,按照正常逻辑,如果小盒子发过来的记录会进行逻辑判断,如果是存在的,则会更新这条记录的更新时间。否则就新增一条记录。 <br/>自己在debug的情况下,拿着出问题的数据,反复测试,从早上7点钟的数据一直测试到下午5点多的数据,一直没有发现问题。于是就怀疑是并发的问题。想请大佬指点指点其中的原理,为什么会这样。一直没有想通。自己也给方法加了同步锁。 <br/>现在目前的解决方式是:给这个表设置联合主键,如果出现重复的情况,则让这次的更新或者插入失效。 <br/>请高手讲讲其中的原理。

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

抖音上很火的时钟效果

反正,我的抖音没人看,别人都有几十万个赞什么的。 发到CSDN上来,大家交流下~ 主要用到原生态的 JS+CSS3。 具体不解释了,看注释: &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;Title&lt;/tit...

记录下入职中软一个月(外包华为)

我在年前从上一家公司离职,没想到过年期间疫情爆发,我也被困在家里,在家呆着的日子让人很焦躁,于是我疯狂的投简历,看面试题,希望可以进大公司去看看。 我也有幸面试了我觉得还挺大的公司的(虽然不是bat之类的大厂,但是作为一名二本计算机专业刚毕业的大学生bat那些大厂我连投简历的勇气都没有),最后选择了中软,我知道这是一家外包公司,待遇各方面甚至不如我的上一家公司,但是对我而言这可是外包华为,能...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

手机经常收到"回复TD退订",回还是不回?今天总算是弄清楚了

自从有了微信和QQ,手机短信几乎很少再用了,但是我们手机里面还是经常会收到"回复TD退订"的消息,那到底要不要回复呢?今天就来告诉大家! 信息内容可能包括 推销信息 品牌活动日的时候,会根据你的用户浏览信息,或者购买记录,后续发送一些降价消息。 但是笔者想说我是缺那10块钱的人嘛,我缺的是1000块。 垃圾信息 虽然我们已经不经常用短信功能,但是还是有不少...

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试官问我:如何加载100M的图片却不撑爆内存

还记得当年面试一个面试官问我怎么加载巨图才能不撑爆内存,我没回答上来,他说分片显示,我寻思特么分片能减少内存使用??现在可以打他脸了! 内容扩展 1.图片的三级缓存中,图片加载到内存中,如果内存快爆了,会发生什么?怎么处理? 2.内存中如果加载一张 500*500 的 png 高清图片.应该是占用多少的内存? 3.Bitmap 如何处理大图,如一张 30M 的大图,如何预防 OOM? A...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

又出事了?网站被攻击了?高中生?

北京时间2020年3月27日9点整,如往常一样来到公司,带开电脑,正准备打开Github网站看一会源代码,再开始手头的工作。哟吼,一直打不开,一直出现如下页面: 我想很多网友也尝到了甜头,各大技术群炸开了锅,据网友反馈有攻击者正在发起大规模的中间人挟持,京东和Github等网站等网站都受到了影响。 什么是中间中间人挟持呢? 简而言之,就是攻击者在数据网络传输的过程中,截获传输过程中的数据并篡改...

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

培训班出来的人后来都怎么样了?(二)

接着上回说,培训班学习生涯结束了。后面每天就是无休止的背面试题,不是没有头脑的背,培训公司还是有方法的,现在回想当时背的面试题好像都用上了,也被问到了。回头找找面试题,当时都是打印下来天天看,天天背。 不理解呢也要背,面试造飞机,上班拧螺丝。班里的同学开始四处投简历面试了,很快就有面试成功的,刚开始一个,然后越来越多。不知道是什么原因,尝到胜利果实的童鞋,不满足于自己通过的公司,嫌薪水要少了,选择...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

6年开发经验女程序员,面试京东Java岗要求薪资28K

写在开头: 上周面试了一位女程序员,上午10::30来我们部门面试,2B哥接待了她.来看看她的简历: 个人简历 个人技能: ● 熟悉spring mvc 、spring、mybatis 等框架 ● 熟悉 redis 、rocketmq、dubbo、zookeeper、netty 、nginx、tomcat、mysql。 ● 阅读过juc 中的线程池、锁的源...

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

工作八年,月薪60K,裸辞两个月,投简历投到怀疑人生!

近日,有网友在某职场社交平台吐槽,自己裸辞两个月了,但是找工作却让自己的心态都要崩溃了,全部无果,不是已查看无回音,就是已查看不符合。 “工作八年,两年一跳,裸辞两个月了,之前月薪60K,最近找工作找的心态崩了!所有招聘工具都用了,全部无果,不是已查看无回音,就是已查看不符合。进头条,滴滴之类的大厂很难吗???!!!投简历投的开始怀疑人生了!希望 可以收到大厂offer” 先来看看网...

推荐9个能让你看一天的网站

分享的这9个保证另你意外的网站,每个都非常实用!非常干货!毫不客气的说,这些网站最少值10万块钱。 利用好这些网站,会让你各方面的技能都得到成长,不说让你走上人生巅峰,但对比现在的你,在眼界、学识、技能方面都有质的飞跃。 一、AIRPANO 传送门:https://www.airpano.com/360photo_list.php 这是一个可以躺在家里,就能环游世界的神奇网站。 世界那么大,绝大多...

大牛都会用的IDEA调试技巧!!!

导读 前天面试了一个985高校的实习生,问了他平时用什么开发工具,他想也没想的说IDEA,于是我抛砖引玉的问了一下IDEA的调试用过吧,你说说怎么设置断点...

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

文章目录1. 无状态登录1.1 什么是有状态1.2 什么是无状态1.3 如何实现无状态1.4 各自优缺点2. 登录交互2.1 前后端分离的数据交互2.2 登录成功2.3 登录失败3. 未认证处理方案4. 注销登录 这是本系列的第四篇,有小伙伴找不到之前文章,松哥给大家列一个索引出来: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密...

月薪22K程序员,打卡迟到10次,收到工资短信一脸懵逼

每家公司为了保证公司员工每天的工作时间,一般都会采用上下班打卡的工作制度,这其实是一个很常见的是,本身也没有什么问题的。正所谓无规矩不成方圆,公司肯定是有公司的规矩,虽然每个员工都很不喜欢这些规矩来束缚我们,但是公司也只是为了能更好的管理员工。但是一家公司如果一成不变的使用打卡制度,而不会去变通管理,也真不一定是好事。 打卡制度特别对于销售部门来说,不但会让公司发展不起来,还很容易丢失员工。但如...

97年世界黑客编程大赛冠军作品(大小仅为16KB),惊艳世界的编程巨作

这是世界编程大赛第一名作品(97年Mekka ’97 4K Intro比赛)汇编语言所写。 整个文件只有4095个字节, 大小仅仅为16KB! 不仅实现了3D动画的效果!还有一段震撼人心的背景音乐!!! 内容无法以言语形容,实在太强大! 下面是代码,具体操作看最后! @echo off more +1 %~s0|debug e100 33 f6 bf 0 20 b5 10 f3 a5...

不要再到处使用 === 了

我们知道现在的开发人员都使用 === 来代替 ==,为什么呢?我在网上看到的大多数教程都认为,要预测 JavaScript 强制转换是如何工作这太复杂了,因此建议总是使用===。这些都...

什么是a站、b站、c站、d站、e站、f站、g站、h站、i站、j站、k站、l站、m站、n站?00后的世界我不懂!

A站 AcFun弹幕视频网,简称“A站”,成立于2007年6月,取意于Anime Comic Fun,是中国大陆第一家弹幕视频网站。A站以视频为载体,逐步发展出基于原生内容二次创作的完整生态,拥有高质量互动弹幕,是中国弹幕文化的发源地;拥有大量超粘性的用户群体,产生输出了金坷垃、鬼畜全明星、我的滑板鞋、小苹果等大量网络流行文化,也是中国二次元文化的发源地。 B站 全称“哔哩哔哩(bilibili...

十个摸鱼,哦,不对,是炫酷(可以玩一整天)的网站!!!

文章目录前言正文**1、Kaspersky Cyberthreat real-time map****2、Finding Home****3、Silk – Interactive Generative Art****4、Liquid Particles 3D****5、WINDOWS93****6、Staggering Beauty****7、Ostagram图片生成器网址****8、全历史网址*...

我真的错了,我被跳槽后的高薪冲昏了头脑...

国内疫情已接近尾声,疫情对生活各个方面造成的影响,就是一场真实的“蝴蝶效应”。“全球最大安全套制造商因疫情停产,已造成一亿个安全套缺口”“口罩印钞机,月入千万的暴富神话”“百程旅行...

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

​能让德国人放弃现金支付​,也没谁了

在新冠疫情中,德国人越来越多地选择在超市,加油站或其他商店付款时使用非接触式付款方式。德国信贷协会Deutschen Kreditwirtschaft (DK) 的一位发言人告诉德国新...

相关热词 c# 按行txt c#怎么扫条形码 c#打包html c# 实现刷新数据 c# 两个自定义控件重叠 c#浮点类型计算 c#.net 中文乱码 c# 时间排序 c# 必备书籍 c#异步网络通信
立即提问