• 关于

    c#修改数据库update

    的搜索结果

问题

PHP MySQL Update

ethnicity 2019-12-01 22:08:30 8171 浏览量 回答数 0

回答

先申明概念: 1、悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。 2、乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。而乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。 所以悲观锁和乐观锁最大的区别是是否一直锁定资源,悲观锁在事物的全流程锁定数据,乐观锁不锁定数据(用读写锁是阻塞事物,而用乐观锁则会导致回滚。这个是一种事物冲突后的不同锁的表象)。乐观锁的最大特点是在最后检查数据是否被修改,如果已被别人修改过,则回滚数据,避免脏数据。至于事物是否冲突和加锁没有直接联系,该冲突的还是会冲突,不管你加悲观锁和乐观锁都会冲突。 悲观锁和乐观锁都是为了解决丢失更新问题或者是脏读。悲观锁和乐观锁的重点就是是否在读取记录的时候直接上锁。悲观锁的缺点很明显,需要一个持续的数据库连接,这在web应用中已经不适合了。 一个比较清楚的场景 下面这个假设的实际场景可以比较清楚的帮助我们理解这个问题: a. 假设当当网上用户下单买了本书,这时数据库中有条订单号为001的订单,其中有个status字段是’有效’,表示该订单是有效的; b. 后台管理人员查询到这条001的订单,并且看到状态是有效的 c. 用户发现下单的时候下错了,于是撤销订单,假设运行这样一条SQL: update order_table set status = ‘取消’ where order_id = 001; d. 后台管理人员由于在b这步看到状态有效的,这时,虽然用户在c这步已经撤销了订单,可是管理人员并未刷新界面,看到的订单状态还是有效的,于是点击”发货”按钮,将该订单发到物流部门,同时运行类似如下SQL,将订单状态改成已发货:update order_table set status = ‘已发货’ where order_id = 001 观点1:只有冲突非常严重的系统才需要悲观锁; 分析:这是更准确的说法; “所有悲观锁的做法都适合于状态被修改的概率比较高的情况,具体是否合适则需要根据实际情况判断。”,表达的也是这个意思,不过说法不够准确;的确,之所以用悲观锁就是因为两个用户更新同一条数据的概率高,也就是冲突比较严重的情况下,所以才用悲观锁。 观点2:最后提交前作一次select for update检查,然后再提交update也是一种乐观锁的做法 分析:这是更准确的说法; 的确,这符合传统乐观锁的做法,就是到最后再去检查。但是wiki在解释悲观锁的做法的时候,’It is not appropriate for use in web application development.’, 现在已经很少有悲观锁的做法了,所以我自己将这种二次检查的做法也归为悲观锁的变种,因为这在所有乐观锁里面,做法和悲观锁是最接近的,都是先select for update,然后update 除了上面的观点1和观点2是更准确的说法,下面的所有观点都是错误的****** 观点3:这个问题的原因是因为数据库隔离级别是uncommitted read级别; 分析:这个观点是错误的; 这个过程本身就是在read committed隔离级别下发生的,从a到d每一步,尤其是d这步,并不是因为读到了未提交的数据,仅仅是因为用户界面没有刷新[事实上也不可能做自动刷新,这样相当于数据库一发生改变立刻要刷新了,这需要监听数据库了,显然这是简单问题复杂化了]; 观点4:悲观锁是指一个用户在更新数据的时候,其他用户不能读取这条记录;也就是update阻塞读才叫悲观锁; 分析:这个观点是错的; 这在db2背景的开发中尤其常见;因为db2默认就是update会阻塞读;但是这是各个数据库对读写的时候上锁的并发处理实现不一样。但这根本不是悲观锁乐观锁的区别。Oracle可以做到写不阻塞读仅仅是因为做了多版本并发控制(Multiversion concurrency control), http://en.wikipedia.org/wiki/Multiversion_concurrency_control;但是在Oracle里面,一样可以做乐观锁和悲观锁的控制。这本质上是应用层面的选择。 观点5:Oracle实际上用的就是乐观锁 分析:这个观点是错的; 前面说了,Oracle的确可以做到写不阻塞读,但是这不是悲观锁和乐观锁的问题。这是因为实现了多版本并发控制。按照wiki的定义,悲观锁和乐观锁是在应用层面选择的。Oracle的应用只要在第二步做了select for update,就是悲观锁的做法;况且Oracle在任何隔离级别下,除了分布式事务两阶段提交的短暂时间,其他所有情况下都不存在写阻塞读的情况,如果按照这个观点的话那Oracle已经不能做悲观锁了-_- 观点6:不需要这么麻烦,只需要在d这步,最后提交更新的时候再做一个普通的select检查一下就可以;[就是double check的做法] 分析:这个观点是错的。 这个做法其实在 http://www.hetaoblog.com/database-lost-update-pessimistic-lock/,’3. 传统悲观锁做法的变通’这节已经说明了,如果要这么做的话,仍然需要在最后提交更新前double check的时候做一个select for update, 否则select结束到update提交前的时间仍然有可能记录被修改; 观点7:应该尽可能使用悲观锁; 分析:这个观点是错的; a. 根据悲观锁的概念,用户在读的时候(b这步)就会将记录锁住,直到更新结束的时候才会将锁释放,所以整个锁的过程时间比较长; b. 另外,悲观锁需要有一个持续的数据库连接,这在当今的web应用中已经几乎不存在;wiki上也说了, 悲观锁‘is not appropriate for use in web application development.’ 所以,现在大部分应用都应该是乐观锁的; 答案来源于网络

养狐狸的猫 2019-12-02 02:17:37 0 浏览量 回答数 0

回答

可以参考以下文章: ######没找到文章链接啊###### 对不起,断网了。 http://www.oschina.net/question/925382_114550 http://www.oschina.net/question/437232_88358 在每个控制器/方法/按钮等一切需要权限控制的地方声明需要的权限(字符串),比如,user:create,user:update,然后在数据库中存储用户,用户所属角色,角色,角色所属权限,权限(类似user:create,user:update),用户登录时读取用户所属的角色和所有权限。 ###### 引用来自“玛雅牛”的答案 对不起,断网了。 http://www.oschina.net/question/925382_114550 http://www.oschina.net/question/437232_88358 在每个控制器/方法/按钮等一切需要权限控制的地方声明需要的权限(字符串),比如,user:create,user:update,然后在数据库中存储用户,用户所属角色,角色,角色所属权限,权限(类似user:create,user:update),用户登录时读取用户所属的角色和所有权限。 @玛雅牛 @jFinal 对于您所说的直接在需要的地方使用权限控制 只是权限死板的一面实现,基于访问路径的动态化才是用户最易维护,你在方法上的配置和在数据库的路径的配置的可维护行完全不在一个层次,基于url只需每次去数据库加载全部的路径访问权限需求,路径变化,修改数据,使用注解或者标签都是不易维护的。个人感觉,声明式权限和访问式权限各有优缺点。要增加这块还得在你的权限拦截器多实现一层挺麻烦的,还得看不少源码,希望考虑一下,或者告诉我怎么让它更具灵活性。 ######回复 @Twisst : 如果出现系统泄漏的问题,你只需要修改权限数据就能修复,但你如果是注解,那你就完蛋了,你要把项目撤下来吗?######我觉得这是两个不同方向: 1、完全抛弃注解的方法,通过数据库来做管理,灵活性高,但我觉得此权限的管理过于灵活,如有误操作或者管理者账号泄密有隐患,系统权限配置如果全部被删,有可能造成整个系统暴露无遗。 2、结合注解的方法,数据库只存放可变的用户权限信息和用户角色,灵活性稍低,且需要维护数据库权限的增删,我觉得安全性更高,即使入侵,且不易影响所有用户。

kun坤 2020-06-06 15:57:48 0 浏览量 回答数 0

阿里云高校特惠,助力学生创业梦!0元体验,快速入门云计算!

学生动手场景应用,快速了解并掌握云服务器的各种新奇玩法!

回答

Re阿里云服务器环境ok后,并安装了wordpress,现如何将本地做好的网站上 一、通过phpmyadmin导出数据库data.sql,打包本地程序 二、将程序打包上传到根目录下 三、修改根目录下wp-config.php里的数据库信息 四、登陆phpmyadmin,导入数据库data.sql,再更改网站地址即可。      找到 wp_options    找到siteurl跟home,把他们都改成你修改后的域名    PS.怕麻烦?直接点击SQL执行UPDATE wp_options SET option_value = replace(option_value, '本地域名', '你的域名') WHERE option_name = 'home' OR option_name = 'siteurl';UPDATE wp_posts SET post_content = replace(post_content, '本地域名', '你的域名');UPDATE wp_posts SET guid = replace(guid, '本地域名','你的域名');

风沙渡 2019-12-01 23:09:55 0 浏览量 回答数 0

回答

limit好像不能用于修改吧,再说了,你已经制定条件为uid=1003了,uid是唯一的吧,如果是的话,就没必要limit了######uid不是唯一,数据有多条###### update 语句中的 limit 只能指定一个数,表示更新多少行后停止,不能跳过多少行再更新。 update member set number=number-1 where uid=1003 limit 2; ###### limit是可以用于修改的。 参考:http://man.chinaunix.net/database/mysql/zh-4.1.0/06-4.html UPDATE 句法 UPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition] [ORDER BY ...] [LIMIT rows] or UPDATE [LOW_PRIORITY] [IGNORE] tbl_name [, tbl_name ...] SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition] ######pgsql的UPDATE是不支持LIMIT的,不知道其他数据库是否也支持 ######过不了几天估计DBA会杀了你小子的。。。######为什么呢

爱吃鱼的程序员 2020-05-30 21:10:42 0 浏览量 回答数 0

回答

是用的ebean吗?把日志级别调低看一下,更新或输出什么? ######回复 @烟火一瞬 : 我猜测是主键值没有设置,因为update默认是根据主键作为条件的。######save是没有问题的。如果直接用sql语句也是可以修改的。但是,我用update,没有出错,但是数据库的数据也是没有改。######是的######你用的什么版本

kun坤 2020-06-05 23:09:36 0 浏览量 回答数 0

回答

是用的ebean吗?把日志级别调低看一下,更新或输出什么? ######回复 @烟火一瞬 : 我猜测是主键值没有设置,因为update默认是根据主键作为条件的。######save是没有问题的。如果直接用sql语句也是可以修改的。但是,我用update,没有出错,但是数据库的数据也是没有改。######是的######你用的什么版本

montos 2020-05-29 21:13:07 0 浏览量 回答数 0

问题

linux虚拟主机上的PHP与数据库进行通讯应该如何配置

fan723 2019-12-01 19:00:15 141 浏览量 回答数 3

问题

mysq数据库连接问题

zhujiajun 2019-12-01 21:04:10 7426 浏览量 回答数 4

问题

mysq数据库连接问题

zhujiajun 2019-12-01 21:04:10 7741 浏览量 回答数 2

回答

你缓存的目的是干什么?我感觉你是好几个场景。######回复 @foodon : 上面那只是一个简单的举例而已 主要问题就是在查询列表!######回复 @SandKing : 缓存是为了加快常用功能的速度,但你这几个加到缓存的内容我没弄清作用。我猜想:1、以uid为key缓存用户是为了经需要用户的信息;2、以username为key缓存password是为了登陆;3、这就弄不懂是什么场景了。######缓存的目的 但然是让查询更快啊######没有人么  这么快 就要沉了。。。###### 是这个样子的 缓存的确是要让查询更快,但是缓存主要是为了多次查询的某一条记录做的 比如说99%的用户需要查询第99条记录,那么把这条记录写入缓存是比较好的方案 但是缓存是有局限性的,像你要统计全表有多少的2类用户,这不可以用缓存来做的,因为这里涉及到的记录是全表中的记录,所以你的问题2是不合适的,因为如果要实现这个功能就不要用缓存做 再一个一般缓存应该不是用时间触发超时的,一般是在每次你向缓存中插入一条记录的时候统计当前缓存中的记录条数,如果达到了缓存大小的极限,那么会用一种选择算法把其中的一条记录去掉。记住这里是向缓存中插入记录,不是所有插入记录的情况。对数据库写操作的时候要直接操作数据库的,只有读操作才经过缓存,而且如果是update的话要判断是不是某条记录与缓存中记录不一样了,那样要修改缓存中的记录。其实对于哪些记录要进缓存也是要用算法判断的,选择大多数用户会查询而且一般不修改的是比较好的可以进缓存的记录。 加缓存的问题很多的,建议查oracle数据库缓存的原理。数据库也是有缓存的,一般不用我们来在程序内设置缓存,如果你想要这方面的知识那么看看oracle缓存一些基本的原理吧。 ######如果一个玩家上线 要保证他的所有请求都比较快,所有的请求都不能超过20毫秒 20毫秒中要包括你的业务逻辑+数据查询等等######你说的这种是对要求不是特别高的情况,我们在做游戏的时候你更具用户要查询一个用户的列表什么的。对查询速度要求比较高! 我要做的是查询 全查询缓存 ,插入 更新 同时修改缓存和数据库###### 不建议用缓存,根本就是根据索引查对象。。 没有达到缓存的基本要求。。 ######这样做 比你查询库 快太多太多了######你是做的缓存吗?怎么这么复杂?缓存一个对象不可以吗?不太理解你的需求。###### 你这等于就是把缓存做数据库来用,所以那个超时移除可以去掉了. 至于那些不常用的数据,可以想办法做到要用到时加载,不用时剔除,这块才是你需要设计的地方,比如说针对这种数据启用超时. ######基本上就是这个意思! 用的时候加载OK没问题,不用时剔除这个就会出现我上面说的这个情况了!###### 引用来自“李三乎”的答案 是这个样子的 缓存的确是要让查询更快,但是缓存主要是为了多次查询的某一条记录做的 比如说99%的用户需要查询第99条记录,那么把这条记录写入缓存是比较好的方案 但是缓存是有局限性的,像你要统计全表有多少的2类用户,这不可以用缓存来做的,因为这里涉及到的记录是全表中的记录,所以你的问题2是不合适的,因为如果要实现这个功能就不要用缓存做 再一个一般缓存应该不是用时间触发超时的,一般是在每次你向缓存中插入一条记录的时候统计当前缓存中的记录条数,如果达到了缓存大小的极限,那么会用一种选择算法把其中的一条记录去掉。记住这里是向缓存中插入记录,不是所有插入记录的情况。对数据库写操作的时候要直接操作数据库的,只有读操作才经过缓存,而且如果是update的话要判断是不是某条记录与缓存中记录不一样了,那样要修改缓存中的记录。其实对于哪些记录要进缓存也是要用算法判断的,选择大多数用户会查询而且一般不修改的是比较好的可以进缓存的记录。 加缓存的问题很多的,建议查oracle数据库缓存的原理。数据库也是有缓存的,一般不用我们来在程序内设置缓存,如果你想要这方面的知识那么看看oracle缓存一些基本的原理吧。 呃,你现在做的都是数据库要做的功能啊。数据库本身是有缓存功能的。你们没有数据库工程师么,这些不应该是代码里要考虑的内容啊。你的总的要求就是要快速的进行数据查询,这应该是数据库里存储过程的功能啊。 平时用代码写的话做个小的缓存自己用还可以,要这样大型的用数据库自己来处理是最好的。 如果非要自己做的话,可以借鉴memDB的思路,我们可以在内存中虚拟一个数据库,按照jdbc driver的接口实现存储在内存中的数据库,你可以让一个专门的服务器用来定期把修改写入本地数据库。 这种情况真心不建议自己做缓存

kun坤 2020-06-11 14:01:26 0 浏览量 回答数 0

问题

mysql 修改select查询出来的数据,修改不了

who2 2019-12-01 21:28:39 1776 浏览量 回答数 1

问题

在选择记录时修改记录中键的最佳解决方案

保持可爱mmm 2019-12-01 21:59:45 2 浏览量 回答数 1

回答

确定不需要加锁嘛···######回复 @Mr_K : 可以的,排它锁和事物管理请问下你能给个思路吗?######回复 @yueqianzhuwei : 同步锁######排它锁吗?还是同步锁?######lock in share mode -- 共享锁  允许事务读取行 for update --排他锁 允许事务修改和更新行 共享锁:这里虽然是读取到了,但是数据可能不是你想要得到的,这里可以采取一种策略,表里加一标志列。 update set xxx where flag = false(表示未使用) 排他锁:这里不需要做任何处理,因为在select for update的时候必须等到其他事务提交里之后才能执行######这个可以的,msyql的更新操作自带排它锁,这样能避免并发问题。 也是一种好的ide######JDBC我是用for update实现的。######update hostpital set isDelete = " +urlInt+ ", 这个地方多线程update会有问题吧,没有锁保护,结果以最后一个update的线程为准 ######回复 @开源中国首席捞比主播 :是的,我懂了。现在要么加同步锁,要么用他说的+1操作,事物操作现在行不通。######回复 @yueqianzhuwei : 那个不是投机取巧,你自己写的代码有问题是因为没有加锁的原因,而他用这种sql是因为数据库执行这条sql的时候会默认加锁,所以不会出现你的情况######回复 @scylla : 嘿嘿######回复 @scylla : 你这个属于投机取巧的,我就是想模拟这个并发问题的。你恰巧把我模拟的并发场景弄没了。######回复 @yueqianzhuwei : 改改sql,update hostpital set isDelete = isDelete + 1,把事务扔给数据库去处理吧。######当年淘宝的某个BUG就是因为锁导致的。。。###### 你可以设计的时候,在这个表加一列值,vesion, update tab set num = num +1 ,version = vesion+1 where id = xxx and version = current_version ,这样就会避免并发处理的问题了。 ######@Transactional(isolation = Isolation.SERIALIZABLE)######我上午测的时候忘记把锁去掉了,下午才发现,重新测了下,你的这个方法行不通。######回复 @yueqianzhuwei : 写的很清楚了:SERIALIZABLE。满足你的要求。######这个事物管理是不是名副其实的串行访问?这个注解实测可以的。###### 你这是无锁操作 想有序输出结果 肯定有问题啊, ###### 你这先查询后,再更新,多个线程执行的时候肯定存在问题。比如同时10个线程执行select,虽然加了for update锁,在没有执行update之前,10个线程的select得到的结果都是一样的,所以这10个update的值都一样。 按照你的意思,直接执行update hospital set isDelete =  isDelete + 1 where hospitalid = 1;就可以实现你的目标,这个不存在并发问题,因为update时DB已经上了锁了 ######select is_delete as isDelete from tablename where id=#{id} lock in share mode 这样就能保证每次查询的值都是上个线程修改过后的值。 我这样操作,就会得到理想的值。但是这个问题是我加的锁竟然是共享锁。######另外,这个问题跟spring mvc没有一丁点关系。另外要实现并发控制,大致的过程应该是这样的 lock ... process business ... release_lock######乐观锁######暂不考虑、

kun坤 2020-06-07 21:19:42 0 浏览量 回答数 0

回答

1.第一个问题通过数据版本,也就是所谓的乐观锁解决。 2.先写日志log,然后ack机制。其实很多这种方式被很多应用所用到比如mysql。 3.用户注册本身这个功能不属于高频调用,所以性能上不需要考虑太多,直接悲观锁实现即可。而且这种可能性非常低,就算失败,那么返回给用户一个能理解的失败信息即可。######回复 @sixliu : 谢谢回复 靠谱的回答真不多 我再等等看...######回复 @花歌 : 第二个 可能没太理解你的场景######谢谢咯~ 1和3可以,我看看还有什么别的方案,差不多也就这么做了,2的话 再考虑考虑吧 感觉还是有点不适用场景###### 三个问题,其实就是同一个并发的问题,###### 都是并发中会出现的问题。 1说的在内存里的情况,就是2。 1说的在数据库中的情况,就是3。 在数据库中,数据库自己会有锁来解决这个问题,遇到这种情况会修改失败,程序中捕获这种异常做处理返回给前台就可以了。 在内存中,单机单进程单线程,会有顺序,因此没有问题。多机或多进程或多线程操作同一数据,会出现此问题。一种实现方式是加锁,相当于仿照数据库那样的实现,内存正在被修改时,其他的修改会被阻塞或者异常终止。另一种方式是通过队列实现顺序操作,所有的修改都发送到一个程序修改。######让我想想,嗯 差不多,回答比较靠谱,谢了先 其实...我用的是nodejs 全异步操作,前面的数据库操作没完成,后面的也可以进入函数,如果网络延迟,就会造成执行完成顺序和开始执行顺序不一致... 等等想一会再问你哈###### 1. 是设计上的问题  两个操作如果有先后顺序  就得先后执行   一个操作完了之后再下一个操作   不可能明知道有一前一后 却还要非得一起 2. 这个就是非常典型的数据库事务   就是保证多个不相关的操作的原子性  只要其中一个出问题就全部回滚  不存在有的成功有的失败  事务还是个挺复杂的东西   mongodb都还不支持事务  多服务器之间分布式的事务也是有些麻烦的   3. 同时的操作 数据库自己会进行锁的处理  对数据库来说还是一前一后    如果某个字段设置了唯一索引  那后面的那个必然会出错  代码里正常处理就可以了   所以用户名不唯一的处理有两个地方  一个是在插入之前  一个是在插入时抛出唯一索引异常      当然也可以在新建用户这一整个操作上加锁   全局同时只能有一个用户在新建  不过这样可能效率不高  ######问题1 现实情况就是这样 用户以为他的操作有顺序 但基于连接池 算是并发操作 即时不用池 那也是异步操作 不能保证顺序 所以只能考虑数据库锁 时间戳 问题2 还没到数据库呢... 只考虑多个内存中的对象操作 问题3 现在就是这样处理的###### 1.加锁 2.加事务控制 3.异常捕获与处理 工作不满一年吧######不好意思... 工作6年多了 开发经验10多年 问题1 暂时用乐观锁解决了 问题2 事务控制个毛线 问题你可能是没读清 内存中的几个对象而已 和数据库无关 就是事务也得自己实现 这话谁都会说 我想听的是 备忘录模式 这种... 到底怎么做能优雅点 还是我从需求设计上可能有问题 问题3 靠数据库唯一约束出错返回太暴力 现在就是这么做的 也可以数据库加锁 怕影响性能###### 1,update user set status=2 where status=3 and id=1; 2,用户名设置唯一索引。###### 可以用现在拷贝上操作,再合并的方法解决。1、按顺序合并。2、按状态合并。3、按索引合并。

爱吃鱼的程序员 2020-05-29 20:15:24 0 浏览量 回答数 0

回答

1.如果是单例的而且是修改成员变量需要考虑 2.根据事务的隔离级别不同,就是是否允许出现幻读和脏读。 3.hibernate的操作都是有事务的,只是根据需要配置不同的隔离级别,你也可以使用乐观锁和悲观锁###### 这个大体是这样的,web的服务,比如servlet这些都是多线程的。但是具体的方法内部其实已经同步过了,比如doPost或者doGet方法,这些方法内部并不需要考虑多线程的问题。其实哪个线程提供了服务都是无所谓的,http本身是无状态的,因此需要session来记录一些信息。 你说的第二个问题其实和第三个问题有些相似,大体上都是数据库事物的问题。如果是处理事物,数据库自己就会加锁,并不需要我们干预。数据库服务本身就是支持并发的,它总是能够支持多个连接同时访问,但对于事物操作执行总是耗时的。这涉及数据库并发的知识。。。 ######他的第一个问题是和web服务无关的,全局变量的修改在多线程环境下肯定需要同步######++那个要考虑,数据库删除,就不用考虑了######每次访问action都是重新new的,但是service都是用的同一个(典型的ssh场景),因此如果在service里定义了共享变量,就需要考虑同步问题。######只用过struts1,本来是不是new,但是action一般会定义属性来封装请求参数,这样就必须把action设为非单例。######struts1 spring mvc 都不是new######第三种的话是数据库的自己的同步,跟事务隔离级别有关。第二种的话删除操作其实只要保证程序正常就行,你原来删除一个不存在的数据肯定需要兼容提示吧。更多的是更新操作,两个人同时读取后更新,这个就需要引入版本号字段。 ###### 1、需不需要同步是要根据你的业务来考虑,普通的方法,一直就不是同步的方法。如果这个count是个浏览数,可以不同步,丢个10个8个浏览数也无所谓 2、第二个问题就是我打开了你的帖子,回答问题,提交之前,@红薯 已经把你的帖子删了,这个时候如果不判断可能会报错,也可能不会报错,具体也得看你的业务有没有这个要求和数据库表的设计,比如这种情况发生的几率有多大,如果是osc这种情况的话,就很少。如果删除和修改都很大的情况下,可以考虑判断一下,再比如就是需要判断,不能出现sql错误。。。那就判断吧,在比如delete只是改个flag,你update的时候没有where flag 条件,更新还能成功呢。。 3、hibernate好久不用,不过hibernate的insert,update,delete默认肯定是没有同步的,需要你自己配置,不配置代码不能自己知道哪个操作需要同步吧 ###### 1. ++必须要考虑,自己同步,否则业务数据出问题,严重 2. 删除/更新问题,一般不考虑,因为即使出错,也是抛出Exception,单个Request失败,只要不影响数据,就可以不考虑,只要做好全局的 RuntimeException 捕获就可以了。 3. 数据库的自身的同步,一般研发可以不考虑。 ######尽量避免业务类全局变量多线程下操作,也可以用jdk的并发库来解决。

爱吃鱼的程序员 2020-06-04 16:46:16 0 浏览量 回答数 0

回答

你的测试用例其实并不严谨。 T1, 因为它没有修改数据,所以,只要有基本的MVCC(多版本并发控制)的功能,就可以满足“可重复读”了,无论T2,T3,T4有没有修改数据,根本无需锁定表。 - 比如oracle,这时默认情况下,T1是从undo中读取"旧"数据。 再考虑数据库可能采用行锁,其实你要测试事务隔离级别的步骤应该是这样: 1. T1 T2 关闭autocommit; 2.T1 - select (开事务) 3.T2 - update t1看得到的记录(随便一条),注意不要commit 4.T1 - update T2中事务影响到的那条记录(此时,T1的事务就被挂起了) 5.T2 - 提交 - (这时,T1也解锁了) 要做这样的测试,其实用单纯的数据库客户端开两个SESSION还直观一些,无论是用mysql或postgresql或oracle都能完成这个测试。 确认用例正常后,再考虑多线程(JDBC),然后再考虑Spring的JDBCTemplate. 这样一步步做过去,出问题时,才容易找到原因,否则纠缠太多,不利于学习中的知识点各个击破。 ######回复 @ganqing : 我认为乐观锁不算是数据库管理系统提供的功能。任何程序都可以自己实现。你的理解也没啥大问题吧: 隔离级别是一个定义,锁是实现的手段,对这个手段的优化,提高性能,就是数据库厂商要做的事了。如通过快照实现“可重复读”的目的就是为了提高并发性。######回复 @szf : 是不是我对于隔离级别的理解有问题?######我这么做主要是为了测试下,因为我之前理解的repeatable-read实现一般是是两种方式:一个是使用共享锁,就是T2必须等待T1完成后才能操作。二是使用类似hibernate乐观锁形式的版本检查,这样T1最后提交时发现版本有问题,报异常,操作不成功。但是目前mysql的repeatable-read实现不是上面的两种方式。######回复 @ganqing : 在测试用例的2. T1 - select * from t1 for update; 3. T2 - update t1 就会锁定了。 -- 这是你要的效果? 设计成这样的应用系统那就有够烂的 -- 实话实说哈,不要介意~######回复 @ganqing : 数据库开发者一般优化的方向是提高性能和并发的同时,保证事务完整性。 你提这样的要求的理由是什么? 你希望的操作流程是怎样的呢?###### T1和T2的连接会话中,autocommit必须是0才行。 如果autocommit=1(默认),那么T1 select后, 这个事务就结束了。 这时,即使select后,也要commit,否则锁表。 还有,这个测试跟spring无关啊 ######明白你的意思了,不过spring在创建数据库连接时已经setAutoCommit=false,T1的所有操作都是在一个事务里面,只在最后提交。######因为是使用spring进行事务管理的,在配置里面将事务的隔离级别设置成了 REPEATABLE_READ,所以和spring有关吧。还有你说的autoCommit设置成0,是在哪里啊,mysql配置?

kun坤 2020-06-08 11:18:36 0 浏览量 回答数 0

回答

limit好像不能用于修改吧,再说了,你已经制定条件为uid=1003了,uid是唯一的吧,如果是的话,就没必要limit了######uid不是唯一,数据有多条###### update语句中的limit只能指定一个数,表示更新多少行后停止,不能跳过多少行再更新。 <preclass="brush:sql;toolbar:true;auto-links:false;">updatemembersetnumber=number-1whereuid=1003limit2; ###### limit是可以用于修改的。 参考:<arel="nofollow">http://man.chinaunix.net/database/mysql/zh-4.1.0/06-4.html <preclass="brush:java;toolbar:true;auto-links:false;">UPDATE句法UPDATE[LOW_PRIORITY][IGNORE]tbl_nameSETcol_name1=expr1[,col_name2=expr2...][WHEREwhere_definition][ORDERBY...][LIMITrows]orUPDATE[LOW_PRIORITY][IGNORE]tbl_name[,tbl_name...]SETcol_name1=expr1[,col_name2=expr2...][WHEREwhere_definition] ######pgsql的UPDATE是不支持LIMIT的,不知道其他数据库是否也支持 ######过不了几天估计DBA会杀了你小子的。。。######为什么呢

优选2 2020-06-09 15:11:09 0 浏览量 回答数 0

回答

当然要批量导入啊。 excel转换成特定SQL文件然后导入数据库。 这里去重,可以考虑一张临时表。 然后插入数据可以使用如mysql的ignore : insert ignore into table_main(id,phone,other)  select id,phone,other from table_temp_uuid; ###### 引用来自“vvtf”的评论 当然要批量导入啊。 excel转换成特定SQL文件然后导入数据库。 这里去重,可以考虑一张临时表。 然后插入数据可以使用如mysql的 ignore : insert ignore into table_main(id,phone,other)  select id,phone,other from table_temp_uuid; 临时表方案靠谱。###### 首先,判断重复用数据库的uniq来做(程序里处理uniq的报错),而不是自己写代码另外去判断。 大数据量的导入建议用csv,读一行导一行,内存占用小。如果非要用excel,记得服务器内存要设置大点。 ######你说的那两个字段加入唯一约束 . 然后开启事务,循环插入,如果插入失败,则改为更新(或你自己的逻辑). 这样快,但肯定很消耗CPU. ######为什么不在list里面去重,再一次导入######这样数据库只需要批量插入的时候维护一次索引,如果修改的其他字段没建索引,那么update是不需要维护索引的######看能不能插入之前拆出2个list,一个是重复的,一个是不重复的(这样拆之前需要select……for update,防止其他事务修改数据)###### 引用来自“death_rider”的评论 为什么不在list里面去重,再一次导入 赞同。具体设计问题不明确不好给意见。不过系统和算法设计中有点是可以肯定的:逻辑处理和数据载入尽量分开。 在单纯的算法设计中,往往不会去考虑数据迁移的成本,这是比较理科的分析方式,而在系统开发过程中,数据迁移的成本是必须要考虑的,这是工程化的必然。 数据迁移,这里是广义上的,包括,数据的转移,从磁盘到外部存储(主板上所谓的内存),从外部存储到片内存储(soc,cpu的内部cache,差异在于无需外部总线);也包括,通过网络在不同处理设备之间的转移;同时还包括数据的结构调整,如数据清洗在逻辑层面的工作。 楼主应该考虑数据的预清洗或后处理。当然具体用哪种更合适,还要自己根据数据的来源,数据之间的关联性,数据处理的实时性等要求来判断。 哈,反正是个系统设计层面的工作。不是工具选择层面的事务。 ######回复 @首席打酱油 : 把需要比对的,做md5等散列数据,可把大概率数据测出来。只有命中时才进行比对。这些工作,需要额外的数据组织,同时需要额外的编程。这些数据过滤的算法,如果用c我看不出有啥太大计算量。######目测楼主说的不能重复不仅是指Excle中的数据不能重复,而且还要Excel中的数据和现有数据库中的数据不能重复,所以不能单纯的把Excle中的数据加载到List中内存去重###### 引用来自“vvtf”的评论 当然要批量导入啊。 excel转换成特定SQL文件然后导入数据库。 这里去重,可以考虑一张临时表。 然后插入数据可以使用如mysql的 ignore : insert ignore into table_main(id,phone,other)  select id,phone,other from table_temp_uuid; 一般怎么把EXCEL转换成SQL文件呢?######如果你的excel本来就是符合load data infile的文件格式, 都不需要解析的。######就是解析excel啊。所以这个方案的耗时也就是解析excel这里。当然这可能也浪费不了多少时间的。 我这里是对MySQL的方案。 解析成对应的MySQL能解析的。比如load data infile。 或者批量insert也行。 然后source。6W条瞬间插入的。######数据直接用com接口导出(服务器处理),分布式处理也行,但是不做任何处理,极限速度,10w体积很小的,1m?连1个高清png的大小都没有,数据也是可以压缩的,重复的数据会压缩很多,上传和带宽不是瓶颈,主要是数据逻辑处理和数据库瓶颈,你处理的时候解析到内存,一个瓶颈,倒入数据库又temp table,还是内存,数据库的内存,又一个瓶颈######你要懂服务器编程才行啊,很多处理单机导出数据还可以,服务器就不这么处理了,还有就是数据库,知道temp table,stor procedure,导入导出,那是数据库初级而已######主要问题在“ Excel文档转List花费4m”,只能异步了。

kun坤 2020-06-08 19:23:25 0 浏览量 回答数 0

问题

云服务器 ECS MySQL 忘记 root 密码解决办法是什么

boxti 2019-12-01 21:57:38 2437 浏览量 回答数 0

问题

什么是Stream增量数据流

云栖大讲堂 2019-12-01 20:59:25 1083 浏览量 回答数 0

问题

常用 SQL 命令(MySQL)

云栖大讲堂 2019-12-01 21:42:05 892 浏览量 回答数 0

回答

findone之后要更新对象的值才可以否则乐观锁会认为是执行了2次 所以报错。是说要用EntityManagerrefresh一下吗看代码怎么写的 save方法他本身就会做判断,jpa里面是没有update方法的,,若实体中存在id,他会到数据库中看是否存在,存在则修改,不存在则添加,修改的时候需要对version进行处理,否则会报错, //修改之前先查询数据库中最新的数据  Objectold=objDao.findOne(id); BeanUtils.copyProperties(要修改的对象,old,newString[]{"version"}); objDao.save(<spanstyle="font-size:13.3333330154419px;">old); 这话的意思是将你要修改的对象的属性复制到数据库中最新的那个对象里,但是version不复制,那么version就是最新的,你也可以将version设置到你的要保存的对象中 不是你说的这个问题,我是save以后,再重新findOne,再对findOne返回的对象进行修改,再save依然有问题这个是合理的啊  同一个对象保存两次???是什么道理  把id转换成一个字符串,需要先insert进数据库才有id第一次用saveAndFlush试下?最后放弃使用@Version了,就没问题了jpa要用merge,persistent之类的吧!springdatajpa的CrudRepository.save已经替你实现了merge和persist 表示不用version 也有这样的问题。线程保存1个实体,触发器监听插入操作,也保存同一个实体到另外的表。然后就报错了 org.springframework.orm.ObjectOptimisticLockingFailureException:Batchupdatereturnedunexpectedrowcountfromupdate[0];actualrowcount:0;expected:1;nestedexceptionisorg.hibernate.StaleStateException:Batchupdatereturnedunexpectedrowcountfromupdate[0];actualrowcount:0;expected:1

爱吃鱼的程序员 2020-06-12 15:20:43 0 浏览量 回答数 0

回答

后台设置了你的数据库配置信息wp-config.php设置了吗? 建议你先绑定域名,然后通过绑定的域名来安装wp。 ------------------------- 回 3楼(没事爬爬树) 的帖子 后台的话需要修改生成的RDS~ 因为你第一次安装的时候数据库已经记录你的临时域名,而你的顶级域名没有记录。 等,我帮你百度一下方法。 ------------------------- 我就以AAA更换成BBB为例,你登录你的RDS,现在你创建的数据库前缀运行~UPDATE wp_posts SET post_content = replace( post_content,  'AAA.com','BBB.com') ;UPDATE wp_comments SET comment_content = replace(comment_content,  'AAA.com', 'BBB.com') ;UPDATE wp_comments SET comment_author_url = replace(comment_author_url,  'AAA.com', 'BBB.com') ;

51干警网 2019-12-02 01:51:37 0 浏览量 回答数 0

问题

最佳实践 -MySQL-RDS for MySQL 5.7如何创建用户

李沃晟 2019-12-01 21:40:06 764 浏览量 回答数 0

问题

使用 DTS 迁移 PPAS 数据

云栖大讲堂 2019-12-01 21:41:01 1084 浏览量 回答数 0

回答

我做的是不是一个功能,而是想封装一个框架,最大的简化逻辑层的代码!######回复 @sxgkwei : 我只能 呵呵。。。######逻辑层的代码?这个都能简化?既然叫做逻辑层,那就说明是跟着具体业务逻辑走的。这个完全没有可简化空间吧?######事务?######没人?######根本没有耐心看完######不知道我说的对不对,因为我没看完你贴的代码,感觉你把问题想复杂了。我感觉在dao这块,不必使用线程安全吧,数据库的锁机制应该满足要求了吧,大不了搞搞约束和事务处理,个人感觉实在没必要控制线程,容易出现死锁甚至影响效率######回复 @SandKing : 进程级的内存?新名词?######我那个DAO只是一个简单的例子! 我要做的是进程级的内存!######楼主需要的是数据库的隔离级别######你的synchronized 锁的是对象,但是你两个线程分别返回了不同的对象,因此互不影响,所以你的synchronized当然没有效果了######用只是举例说明。。。######根本不是synchronized的问题,你这里是不是想做单例??通过单机的内存来管理JVM中只存在一个对象??######回复 @SandKing : 是啊,那你怎么还用######所以我才说,synchronized对于我的这个需求无用!######数据有共享才有线程安全性问题,文中提到的问题应该是数据库层面的问题。 jvm 层面数据共享产生的线程安全问题-synchronized,lock, volatile 数据库的共享数据的并发修改-悲观锁,乐观锁。数据库的事务隔离级别。 缓存的更新问题 ######嗯,我就是把数据库的数据映射到JVM中,然后缓存。多线程数据共享!采用的乐观锁!更新缓存!###### 1、同步 数据层的查询和更新方法。或者业务逻辑层的方法 2、sql语句,查询时+ for update ###### 请参考: 线程安全的判定

kun坤 2020-06-09 23:07:40 0 浏览量 回答数 0

回答

数据库本身会保证操作的原子性的啊###### 引用来自#2楼“红薯”的帖子 数据库本身会保证操作的原子性的啊 也就是说,我如果要修改一条记录,只要一个update语句就行了?

kun坤 2020-06-09 22:10:48 0 浏览量 回答数 0

回答

一、通过phpmyadmin导出数据库data.sql,打包本地程序 二、将程序打包上传到根目录下 三、修改根目录下wp-config.php里的数据库信息 四、登陆phpmyadmin,导入数据库data.sql,再更改网站地址即可。      找到 wp_options 点红框     找到 siteurl 跟 home ,把他们都改成你修改后的域名     PS.怕麻烦?直接点击SQL执行 复制代码 UPDATE wp_options SET option_value = replace(option_value, '本地域名', '你的域名') WHERE option_name = 'home' OR option_name = 'siteurl'; 复制代码 UPDATE wp_posts SET post_content = replace(post_content, '本地域名', '你的域名'); 复制代码 UPDATE wp_posts SET guid = replace(guid, '本地域名','你的域名'); ------------------------- http://help.aliyun.com/view/13435137.html这个帮助中心里写的很清楚,我正好手头上没有开启的ECS实例,所以没法给你一步步的操作,不过这个信息写的很详细。 感谢你对阿里云和云学院的支持。谢谢 ------------------------- 回 6楼(evnightmare) 的帖子 如果备案有什么问题,可以留言,我们看看如何帮助你完成。 谢谢对阿里云的大力支持! ------------------------- 回 8楼(lucifer0825) 的帖子 不适合,个人还是推荐你用Linux,因为你用WIN2012时会遇到很多软件兼容性的问题。 而且稳定性并不是特别号,因为WIN2003是需要优化才能使用的。 真诚推荐你学着用Linux,如果一定要用WIN系,这个链接可以帮助到你: http://bbs.aliyun.com/read.php?tid=167132 ------------------------- 回 13楼(bro+) 的帖子 检查 wp-config.php 里的数据库是否存在,链接地址,用户名,密码对不对,装phpmyadmin检查一下数据库吧

随歌 2019-12-01 23:34:03 0 浏览量 回答数 0

问题

使用 DTS 迁移 MySQL 数据

云栖大讲堂 2019-12-01 21:40:55 1317 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站