update

Mysql查询语句使用select.. for update导致的数据库死锁分析

非 Y 不嫁゛ 提交于 2020-01-25 14:51:17
近期有一个业务需求,多台机器需要同时从Mysql一个表里查询数据并做后续业务逻辑,为了防止多台机器同时拿到一样的数据,每台机器需要在获取时锁住获取数据的数据段,保证多台机器不拿到相同的数据。 我们Mysql的存储引擎是innodb,支持行锁。解决同时拿数据的方法有很多,为了更加简单,不增加其他表和服务的情况下,我们考虑采用select... for update的方式,这样X锁锁住查询的数据段,表里其他数据没有锁,其他业务逻辑还是可以操作。 这样一台服务器比如select .. for update limit 0,30时,其他服务器执行同样sql语句会自动等待释放锁,等待前一台服务器锁释放后,该台服务器就能查询下一个30条数据。如果要求更智能,oracle支持for update skip locked跳过锁区域,这样能不等待马上查询没有被锁住的下一个30条记录。 下面说下mysql for update导致的死锁。 经过分析,mysql的innodb存储引擎实务锁虽然是锁行,但它内部是锁索引的,根据where条件和select的值是否只有主键或非主键索引来判断怎么锁,比如只有主键,则锁主键索引,如果只有非主键,则锁非主键索引,如果主键非主键都有,则内部会按照顺序锁。但同样的select .. for update语句怎么就死锁了呢?同样的sql语句查询条件和结果顺序都一致

ununtu 16.04安装ROS,遇到的问题sudo rosdep init失败,rosdep update失败

左心房为你撑大大i 提交于 2020-01-25 14:42:07
Ros安装见:http://wiki.ros.org/kinetic/Installation/Ubuntu 可能遇到的问题: 当进行到sudo apt-get update时 可能会遇到更新失败的问题,如果这样请百度更换ros国内镜像源,可用镜像有中科大,清华大学等。 当进行到sudo apt-get install ros-kinetic-desktop-full时 可能会遇到下载软件包很慢的情况,如果赶时间请百度更换ros国内镜像源。如果不赶时间,就等待自行下载更新完成为止。 当进行到sudo rosdep init失败时,即出现如下图打印: 或者如下打印 说明网络太差,可以直接绕过这一步,sudo rosdep init这句话的目的就是在/etc/ros/rosdep/sources.list.d/的路径下生成20-default.list文件,并在文件中写入如下内容:(浏览器打开下方网址,即可看到) https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list 我们可以手动新建文夹,并在文件中填入网址的内容,保存退出,并直接运行:rosdep update,命令。 当运行rosdep update命令是,可能会出现如下打印: 或者出现其他Error

Mybatis-Plus自动填充更新操作相关字段

耗尽温柔 提交于 2020-01-25 09:27:19
在阿里开发手册的建表规约中有说明,数据库表中应该都要有 create_time、update_time 字段;那么在开发中,对于这些共有字段的处理应该要进行统一,这样就可以简化我们的开发过程。那么本文就对 Mybatis-Plus 中的字段自动填充进行记录。 场景介绍 在项目的数据表设计中,每张表都有 create_id、create_time、update_id、update_time 这四个字段,那么在Java应用中,针对新增和修改操作要对这四个字段进行相应的更改: create_id、update_id 要自动填充为当前登录的用户ID create_time、update_time 要自动填充为当前时间 下面说说代码实现: 自动填充处理器 需要实现 Mybatis-Plus 中的 MetaObjectHandler 接口 import com . baomidou . mybatisplus . core . handlers . MetaObjectHandler ; import hw . topevery . basis . runtime . UserRuntime ; import org . apache . ibatis . reflection . MetaObject ; import org . springframework . stereotype .

MongoDB 文档的更新操作

佐手、 提交于 2020-01-25 02:51:06
在MongoDB中,更新单个doc的操作是原子性的。默认情况下,如果一个update操作更新多个doc,那么对每个doc的更新是原子性的,但是对整个update 操作而言,不是原子性的,可能存在前面的doc更新成功,而后面的doc更新失败的情况。由于更新单个doc的操作是原子性的,如果两个更新同时发生,那么一个更新操作会阻塞另外一个,doc的最终结果值是由时间靠后的更新操作决定的。 通过使用 $isolated option,能够确保更新多个doc的写操作是原子性的,任何查询操作都会读取到更新操作,直到该操作完成(成功或失败)。 Prevents a write operation that affects multiple documents from yielding to other reads or writes once the first document is written. By using the $isolated option, you can ensure that no client sees the changes until the operation completes or errors out. MongoDB在新增和更新数据的时候,不会实时写入到Disk中,可能会丢失数据。 一,语法 默认情况下,update只会更新single doc

mysql之数据初始化update操作

前提是你 提交于 2020-01-24 23:51:55
1.单表的:update user set name = (select name from user where id in (select id from user where name='小苏')); update goods set name = REPLACE(name ,' ','') ; //去空格 update goods set name = replace(name,'香蕉','苹果') ; //香蕉换苹果 update goods set name = price ; //将自己表中的数据赋值给另外一个属性 2..update sr_main_ww a set sys_tjzt = 4 where exists (select 1 from sr_main b where a.fk_pk_sr_main = b.pk_sr_main and b.sys_spzt = 1); exists 用法 3..新建表需要原表的数据(sr_main ,sr_detail ,护理人数计算) update sr_main a set a.main_xm_nam05 = ( select count(1) from sr_detail b where a.pk_sr_main = b.fk_sr_main and b.detail_bz_sad06 in ('1','2','3

Mongodb高级更新

隐身守侯 提交于 2020-01-24 17:47:16
1.数据更新命令 1.1 update 1)语法 db.collection.update(criteria,objnew,upsert,multi) --注: 1)criteria:查询条件; 2)objnew:更新对象和更新操作符; 3)upsert:如果不存在更新文档,是否要插入新文档,true为插入,默认为false不插入; 4)multi:默认为false,只更新匹配的第一条记录;为true,更新所有匹配记录; 2)例子 --更新集合clt1中域f1>1的第一个文档的域f2为test2 db.clt1.update({f1:{$gt:1}},{$set:{f2:"test2"}}); --更新集合clt1中域f1>1的所有文档的域f2为test2 db.clt1.update({f1:{$gt:1}},{$set:{f2:"test2"}},false,true); ----更新集合clt1中域f1>5的第一个文档的域f2为test2,如没匹配文档,则插入新文档 db.clt1.update({f1:{$gt:5}},{$set:{f2:"test2"}},true,false); 1.2 save 1)语法 db.collection.save(obj) --注 1)obj为更新或插入的文档,如collection内有匹配对象,则更新;否则,将插入该文档; 2

MySQL INSERT ON DUPLICATE KEY UPDATE

蹲街弑〆低调 提交于 2020-01-24 17:26:46
来源: https://www.mysqltutorial.org/mysql-insert-or-update-on-duplicate-key-update/ Introduction to the MySQL INSERT ON DUPLICATE KEY UPDATE statement The INSERT ON DUPLICATE KEY UPDATE is a MySQL’s extension to the SQL standard’s INSERT statement. When you insert a new row into a table if the row causes a duplicate in UNIQUE index or PRIMARY KEY , MySQL will issue an error. However, if you specify the ON DUPLICATE KEY UPDATE option in the INSERT statement, MySQL will update the existing row with the new values instead. The syntax of INSERT ON DUPLICATE KEY UPDATE statement is as follows: INSERT

mongoDB 学习七

我们两清 提交于 2020-01-24 13:51:50
MongoDB 更新文档 MongoDB 使用 update() 和 save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。 update() 方法 update() 方法用于更新已存在的文档。语法格式如下: db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } ) 参数说明: query : update的查询条件,类似sql update查询内where后面的。 update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的 upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。 multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。 writeConcern :可选,抛出异常的级别。 实例 我们在集合 col 中插入如下数据: >db.col.insert({ title: 'MongoDB 教程', description: 'MongoDB 是一个

mysql的ACID的理解

 ̄綄美尐妖づ 提交于 2020-01-24 10:16:05
这是在网上copy下来的ACID的概念,可以直接跳过看后面: 1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。 2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。 3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。 4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。 其中,原子性和持久性的概念比较好理解。但是最近发现老是把一致性和隔离性混淆。 个人理解,隔离性主要是针对读操作的。在不同事务之间,读操作隔离。比如另一个事务对数据修改后,会不会影响当前事务的读操作,要不要读到更新后的数据。 一致性,主要强调的是数据的更新是不是“正确”,即,是不是符合我们的预期,这个和读操作应该是要分开看待的,这里应该只强调写操作。 造成我对这俩个概念的混淆的原因是,在java的并发编程中,我们关注的似乎只有一致性