电脑蓝屏维修无法开机必须强制关机后才能开机

2015年4月 荣获微软MVP称号2014年4月 荣获微软MVP称号
2014年12月 企业软件大版内专家分月排行榜第一2014年11月 企业软件大版内专家分月排行榜第一2014年7月 企业软件大版内专家分月排行榜第一2011年10月 企业开发大版内专家分月排行榜第一2011年5月 企业开发大版内专家分月排行榜第一2011年3月 企业开发大版内专家分月排行榜第一2010年12月 企业开发大版内专家分月排行榜第一2010年11月 企业开发大版内专家分月排行榜第一2010年9月 企业开发大版内专家分月排行榜第一2010年8月 企业开发大版内专家分月排行榜第一2010年7月 企业开发大版内专家分月排行榜第一2010年6月 企业开发大版内专家分月排行榜第一2010年5月 企业开发大版内专家分月排行榜第一
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
先看一个常见的情况,用户注册:
if (select id from tb_user where name = '$name') {
// 可以注册
INSERT INTO tbl_name (name, password) VALUES ('$name', '$password');
// 用户名已存在不能注册
上面这是我写的注册代码,我看到大多数程序也都是这样的,但是现在我发现了一个问题,当很多人同时注册时,可能导致一个问题,这是我此前从未注意想到的:
mysql select 默认会使用共享读锁,当两个进程同时执行到第一条sql select判断用户是否注册(明显此时还未执行到第二条新增的sql语句,用户还没有注册),会导致两个进程谁也不知道谁,傻傻的以为该用户名可以被注册,于是执行插入,这就导致了name用户名重复了,而用户名应该是唯一的。
有人可能说了唯一的用户名必须是唯一索引,好吧,的确我建了唯一索引,虽然这样避免了表中出现相同name值,但是两次INSERT INTO插入相同的name导致sql执行错误了,这就是我要说的问题1:
【1】能否有办法避免sql出错
当多个人同时使用相同的用户名进行注册,只会有一个人得到提示“注册成功”,其他人会得到提示“注册失败”,那些注册失败不幸的人,我们该怎对他解释你是如何会注册失败的? 很伤心,sql执行出错了,我该用什么心情去对待它,怎么去感受,怎么去理解它,如果在调试的时候一般会直接终止程序报错的,如果在部署时不终止程序,记录出错日志信息,我应该这样做吗?这就是我要说的第二个问题和第三个问题:
【2】不幸的事还是发生了,SQL执行出错了,我们该怎么跟用户解释,怎么向他解释他为何注册失败了【3】当在系统执行时SQL出错了,我们是终止程序报错,还是继续执行,只是记录错误日志呢
我们要保证数据的完整性,不能出现任何的意外,如果你支付宝的余额字段一会少一会多你愿不愿意,一会突然没有了你愿意吗,如果银行突然跟你说你存的钱不见了,不知道哪儿去了,你的余额为零,你什么感想?这就是我要说的第三个问题:(实际是对第二个问题的深入探讨)
【3】为确保安全,使用innodb引擎,每次执行sql前开启事物,只要程序一有失败(包括sql执行失败,程序逻辑控制的等等不是全部成功的)就立即回滚,中断退出程序执行流程
第三个问题说到方法看起来可以完美的解决所有所有的问题,并且其实实现也非常容易(在使用的框架时代通过getDbError()就能知道是否有sql错误了),但是这也引发一些思考,不管什么情况都开启事物值不值得,有没有必要,明显有的情况可能没有必要,这就是我要说的问题四:
【4】什么时候需要使用事物,以及如何使用,事物是必须的吗,为什么DZ,WordPress不使用事物也照样安全
探讨这个问题时我们先来思考一下事物本身,以及问题本身:
1:我们遇到什么问题,迫于没有好的办法解决2:事物能帮我们解决什么问题
我们先用事物解决第一个注册时的并发问题,开启事物后使用查询时可以使用for update行锁来避免并发的问题,在本次事物提交前会一直锁着,所以那些不幸的用户会得到“该用户名被占用,不能注册”的提示,OK这个问题解决了。
以上就是我的一些困惑,和一些浅薄的理解,希望大神指点迷境,我郁闷好久了,这些问题困扰着我,让我每天过的提心吊胆的,整个人都不好了,看着之前那些代码,没有事物,没有回滚,没有提交,复杂的逻辑,一排的sql增删改,如新增一个商品就会设计多张表的sql,逻辑等等,我只在调试时没有问题就部署上线了,万一那一条sql失败,后果不敢想象,我只能假设调试好了,永远不可能有意外的,可以我只是假想这样,心里没有底。
比如面对我项目中这样的情况,我心里没有底了:
$sql = update tb_goods `collection` = `collection` + 1 where id = 1;
#sql2 = update tb_user `collection_num` = `collection_num` + 1 where uid = 1;
if ($sql) {
if($sql2) {
'收藏成功!';
'收藏失败!';
return '收藏失败';
现在所有的代码都是这个样子的,假如第一条SQL成功,第二条失败怎么办?
还有跟多这样的情况,有的甚至根本就没有判断
// 在一个商品添加逻辑中
insert 一行数据 添加一个商品
update 更新分类表对应的某一行的商品数量
update 更新商家表对应的某一行的商品数量
insert 针对当前商品ID新增一条统计记录
insert 针对当前商品ID新增一条操作记录
$sql_n 根据系统逻辑有n条这样sql
// 很多sql我们不可能这样吧
exit('商品添加失败!');
if(!$sql2)
exit('商品添加失败!');
if(!$sql_n)
exit('商品添加失败!');
exit('商品添加成功!');
// 最后商品添加成功
if ($sql) {
if ($sql2) {
if ($sql_n) {
exit('商品添加成功!');
} else exit('商品添加失败!');
} else exit('商品添加失败!');
} else exit('商品添加失败!');
现在像这样的sql ~ sql_n 这样的情况我只判断关键的几条sql就敢返回 商品添加成功,或者 商品添加失败 其它的一些sql就假设它会成功,不用判断,我当时小不懂事,一直就是这么来的,看别人的吗好像也是这样的,只判断关键的sql if ($sql) return 1; else return 0;其它的都假设会成功,我现在觉得这样不靠谱,求大神解答啊
希望大神结合实例说明,解除我心中的困惑,感激不敬 ^_^
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
好长的问题……但感觉你想问你你已经知道答案了呀。事务就是解决这个问题的好方案。
至于你说的DZ或者WP没有使用事务也照样安全,这句话并不是正确的,只是大部分时候他们所承载的并发并不大,所以显得很安全而已。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
不是大神,简单讲一下自己的理解
首先第一个问题,需要考虑的并不是sql出错了,要担心的应该是数据 写/读 冲突,sql没有报错你却不知道的这个情况。比如注册的并发,使用PRIMARY/UNIQUE就好了,然后直接INSERT,也犯不着先去查一遍username是否存在,让数据库自己解决这个问题。
第二个问题,返回错误了就告诉用户用户名已经占用了就好,各个业务逻辑部分所执行的sql指令自然有它的意义,既然错误了,那就告诉用户错误了,为何纠结于此?
第三个问题,如果这个数据操作的错误会是致命的,你在上线之前就应该以更完善的逻辑来处理,不应该出现程序异常终止的情况,因为对于数据的操作,在未知的位置停止程序,数据的结果也是未知的。保证数据的完整性和可知性应该为第一目的。
第四个问题,对于高并发读写来说,选择InnoDB应该是更合理的并且性能也是更好的,毕竟有行锁;并发冲突不会很严重的使用MyISAM引擎会有更好的性能和更小的开销;至于是否使用事务,只能看具体的业务,再衡量了。如果像是支付宝这种,需要高安全性,却又不想让用户等太久,同时还有超高的并发,可能会采用分布式+堆积队列+事务的形式了。但是银行这种需要超高可靠性的系统,我听说都是拿大型机抗下来的。
给你找了一些资料,参考一下: //淘宝中间件-消息队列系统
//美团点评团队-事务级别和锁 //阿里云RDS-InnoDB事务
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
开启事务可以较为简单而且直接地解决你遇到的问题,而且对现有代码的改变量也是最小的。至于你说的值不值得,因为所有事务只有在写入时才开启,而且innoDB的锁又是基于行的,所以在并发写入不是特别大的时候对系统的影响是非常小的。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
好长,来晚了,但是我要指出一个很重要的事情:
错误处理是程序的正常、并且是非常重要的一部分。你不需要保证每个调用都不出错,而要尽量保证妥善处理这个错误。
事务对我来说是必须的。我每接手一个涉及 MySQL 的项目,它就会多出好多事务处理。因为我没心情去处理用户点快了导致数据库出现不该出现的数据之类的情况。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
1:开启事务处理2:如果发现sql出错就是那个unique索引,直接提示用户,网络繁忙,或者请更换一个用户名试试,另外注册的时候加验证码有效避免同一时间很多并发注册请求
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
sql1...sqln
有异常就回滚,没异常就提交。
基本逻辑就是上面的样子。sql只要有一条没成功,就会回滚所有。所有sql都成功,才会真正提交。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
可以考虑把name 字段在数据表中设置为unique 在验证是否有人已经注册时直接插入,如果成功则没有人应用。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
不是大神,帮你解答一下,1,你考虑的SQL失败的问题,这个不算是问题,SQL失败了就给一个友好的提示即可,但是同时要触发报警系统,搞这个系统的很快就会修复的。2,一般情况下只要是涉及到很重要的数据必须要使用事务,事务的基本原则就不讲了,学计算机的都应该熟练掌握,特别是后端3,一般大公司会有独立的用户系统,这个系统一般都是很通畅的,一般采用单点登录4,关于安全,看你怎么理解了,没有绝对的安全,但是要做到尽量不要让别人钻空子,SQL注入什么的还是要防的,看你写php的,尽量使用一些框架吧,可以先读读这些框架的原理
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 App2072人阅读
【VB.net机房收费系统】(24)
个人版机房收费系统暂时的告于段落,对于和数据库的交互,现在总结一下。
一 数据库连接
  1 vb.net&和SQL Sever&连接,使用的connection&是SqlConnection,这也是最常用的连接对象。我们需要在vb.net&中引用System.Data以及System.Data.SqlClient.
   Imports&System.Data
   Imports&System.Data.sqlclient
  2&添加完引用之后,就是创建connection&对象
& & &  连接字符串(告诉connection对象使用什么用户名和密码,连接哪一台计算机上的哪个数据库),其形式如下:
   Dim&conStr&as string =”Data Source=192.168.**.**;Initial Catalog=Charge_uid=pwd=******&
   Dim conn as&Sqlconnection=new&SqlConnection(conStr)
  3&开放和关闭连接
& & &  Conn.open
& & &  Conn.close
二数据库操作
&&&&&&1&使用command对象执行SQL语句
&&&&&&&&&&&创建Command:
    dim&cmd&as new&sqlCommand
    cmd.connnetion=conn
    mandtext=” ”&这里是sql&语句
&&&&&&2执行sql语句:
&&&&&&&&&&&前提必须是conn&连接打开:
     conn.open
     Cmd.executenonquery()
&&&&&&3&注意事项:连接打开,执行完sql语句之后,必须进行关闭,否则当连续执行sql&语句的时候会出现异常
三&dataadapter,dataset,datareader&和datatable的相关使用
&&&&&&Dataadapter&是专门用来处理脱机数据的,它将查询到的数据放入dataset中(自己理解的是计算机内存中)这样当数据库连接关闭的后也可以对存放在内存中的数据集进行操作;如果只需要执行sql语句,就没必要用到dataadapter。
&&&&&&主要方法:
1 Fill,将数据库中的数据填充到dataset中&
&Dim&&ds&&as&&new&&DataSet
&Dim&&da&&as&&new&&SqlDataAdapter
& da.Fill(ds,”StudentInfo”)
2 Update,将dataset中的数据更新到数据库
& Dim&&ds&&as&&new&&dataset
& Dim&&da&&as&&new&&SqlDataAdapter
& da.update(ds,”StudentInfo”)
&&&&&&dataset&可以看做不依赖于数据库的独立数据集,当断开或者是关闭数据库是,dataset依然可以使用,dataset主要是由一组datatable对象组成
dim&&ds&&as&&new&&dataset
ds.tables.add(dt) ‘向dataset中添加datatable
datatable是一个临时保存数据的网格虚拟表,可以用来存储数据,可以动态添加相关的数据,也可以从某个dataset中得到
sqldataReader,是读取数据库中某个数据的方法,获取的数据时只读类型的,经常和sqlCommand连用
& & & & & & & & & & & &  dim&&sql&&as string&&=” select&&*&&from&&UserInfo&&where&UserID=’1’”
&&&&&&&&&&&&&&&&&&&&&&&&&&&&dim&&cmd&&as&&sqlcommand&= new&&sqlcommand(sql&,conn )
&&&&&&&&&&&&&&&&&&&&&&&&&&&&dim&&read&&as&&SqlDataReader
&&&&&&&&&&&&&&&&&&&&&&&&&&&&conn .open ()
&&&&&&&&&&&&&&&&&&&&&&&&&&&&read=cmd.executeReader
& & & & & & & & & & & & & &user.userID=read.item(0)这里也可以是user.userID=read.item(“UserID”),即数据库字段名称或是索引号。
&&我们通过一个简单例子来使用一下前面介绍的对象;
   Dim Constring
string=”data source=192.168.24.**;database=Charge_Suid=pwd=202414;”
string =”Select * from User_Info”
sqlconnection(Constring)
sqlcommand(sqltxt,sqlconn)
sqldataadapter(sqlcmd)
sqldataReader
Sqlconn.open()
Read=sqlcmd.executeReader
Read.Read()
Msgbox (read.item(3))
Read.close()
Da.Fill(ds,”UserInfo”)
Datagridview1.datasource=ds.table(“UserInfo”)
Msgbox(ex.message)
Sqlcmd.dispose()
其实,对于sql&和vb.net&的交互,如果说使用三层结构的话,这种最原始的交互方式是不适合的,因为复杂的数据库中对数据库的操作何止简简单单的一个!!!如果对数据库每进行一次操作,就要这样写一次的话,三层的意义也就不存在了,因此,那些大牛就想到了将对数据库的增删改查全都封装到一个类中,根据参数,返回值的不同情况,来执行对数据库的交互,操作等,这就是我们下次要写的sqlHelper类;
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:195819次
积分:6413
积分:6413
排名:第3461名
原创:147篇
评论:2064条
欢迎光临磊磊的学习小站,真心祝福关心磊磊学习的朋友们^_~
(4)(5)(4)(4)(4)(4)(4)(4)(4)(4)(4)(2)(4)(4)(2)(2)(4)(3)(4)(4)(4)(6)(4)(4)(3)(4)(2)(2)(2)(1)(1)(3)(4)(3)(4)(6)(5)(14)(2)

我要回帖

更多关于 6s关机后充电才能开机 的文章

 

随机推荐