wordpress搬家问号,日喀则网站seo,网站上做树状框架图用什么软件,广州专业网站事务机制
1.事务概念 在对数据的操作的过程中#xff0c;涉及到一连串的操作#xff0c;这些操作如果失败#xff0c;会导致我们的数据部分变化了#xff0c;部分没变化。这个过程就好比如你去吃早餐#xff0c;你点完餐了#xff0c;并且吃完早餐了#xff0c;没付钱你…事务机制
1.事务概念 在对数据的操作的过程中涉及到一连串的操作这些操作如果失败会导致我们的数据部分变化了部分没变化。这个过程就好比如你去吃早餐你点完餐了并且吃完早餐了没付钱你就跑了这不符合正常的流程要保证你是否付钱了现在有收款语音播报器能清楚你是否付了钱了。为确保数据的可靠性采用事务来进行处理。
事务涉及了四个基本特性(ACID):
原子性atomicity事务作为一个整体被执行包含在其中的对数据库的操作要么全部被执行要么都不执行。一致性consistency事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。隔离性isolation多个事务并发执行时一个事务的执行不应影响其他事务的执行。持久性durability已被提交的事务对数据库的修改应该是永久性的。
2. 使用事务 事务和其他支持事务的数据库一样需要开启和提交事务MongoDB事务涉及到wirteConcern和readConcern两个属性上
2.1wirteConcern wirteConcern决定了写操作需要落入到多少个节点才算成写入成功
writeConcern的属性有
1.w
w 为0时,对写入数据的正确性不关心不需要确认
w 为1时, 数据写入到主节点就与客户端进行确认
w 为majority时,数据写入到大多数成员后再与客户端进行确认
2. 具体的数字
j 为true时数据写入到主节点持久化后就与客户端进行确认
3.wtimeout 写入超时时间防止一直等待的情况超过超时时间未结束写入失败
4. 具体的数字
落入到具体数字的节点才与客户端确认// 包含延迟节点的3节点pss复制集
db.collection.insertOne({name:李四},writeConcern:{w:majority}})
// 等待延迟节点写入数据后才会响应
db.collection.insertOne({name:王五},{writeConcern:{w:3}})
// 超时写入失败
db.collection.insertOne({name:小明},{writeConcern:{w:3,wtimeout:3000}})使用事务的话大多数情况时使用{w:majority}
2.2 readConcern 读取处于事务中的数据时需要知道从那读以及能读取什么样的数据。
readPreferce来解决从哪读的问题
其中选择节点读取的参数有如下:
1primary: 只选择主节点默认模式 2primaryPreferred优先选择主节点如果主节点不可用则选择从节点 3secondary只选择从节点 4secondaryPreferred优先选择从节点 如果从节点不可用则选择主节点 5nearest根据客户端对节点的 Ping 值判断节点的远近选择从最近的节点读取。
具体使用:
# 通过 MongoDB 驱动程序 API
MongoCollection.withReadPreference(ReadPreference readPref)# Mongo Shell(指定从哪读) 使用readPref简写
db.collection.find().readPref( secondary )
db.fsyncLock() 锁定写入
db.fsyncUnLock() 解锁写入Tag: readPreference的拓展
readPreference只能控制一类节点而Tag可用于控制一到多个节点可实现定制服务某些节点负责在线服务某个服务负责报表服务。 具体使用
# 为复制集节点添加标签
conf rs.conf()
conf.members[1].tags { purpose: online}
conf.members[4].tags { purpose: analyse}
rs.reconfig(conf)#查询
db.collection.find({}).readPref( secondary, [ {purpose: analyse} ] )readConcern解决能读取什么样的数据 决定从哪个节点读取数据后还需要考虑读取什么样的数据可选以下参数
1 available读取所有可用的数据; 2 local读取所有可用且属于当前分片的数据; 3 majority读取在大多数节点上提交完成的数据; 4 inearizable可线性化读取文档仅支持从主节点读(线性); 5 snapshot读取最近快照中的数据仅可用于多文档事务(不出现脏读、不可重复读、幻读);
脏读: 读取了事务回滚前的数据或未正确同步的数据。
不可重复读: 事务A先读取了一条数据此时事务B对该数据进行了更新事务A再次读取了该数据此时前后读取的数据不匹配。
幻读: 事务A读取了N条数据事务B对这N条数据进行了删除或新增操作事务A重新读取数据时数据的条数产生了变化从而产生了幻读。
readConcern读取数据时引发脏读的原因以及解决办法 写入数据只到达主节点没有到达其他节点一旦主节点出现故障从节点没来得及复制数据从而导致脏数据的出现。可以设置写入落入大多数节点时再进行写入虽然消耗了点性能但保证了数据的不丢失。设置{readConcern: “majority”}。
安全的实现读写分离 安全的读写分离有利于提高效率并且确保数据安全其中的措施是将写入和读取都使用majority这个值确保数据在多个节点都是存在的并且要选取备节点进行读取。
# 使用writeConcernreadConcern majority来解决
db.collection.insert({oid:101,sku:kite,q:1},{writeConcern:{w:majority}})
db.collection.find({oid:101}).readPref(secondary).readConcern(majority)5.事务流程
事务内的改变事务外是无法获取的直到提交事务后。
var session db.getMongo().startSession()
# 开启事务
session.startTransaction()var coll session.getDatabase(test).getCollection(tx)
#事务内修改 {x:1, y:1}
coll.updateOne({x: 1}, {$set: {y: 1}})
#事务内查询 {x:1}
coll.findOne({x: 1}) //{x:1, y:1}#事务外查询 {x:1}
db.tx.findOne({x: 1}) //{x:1}#提交事务
session.commitTransaction()# 或者回滚事务
session.abortTransaction()