2009年11月19日木曜日

离线并发与锁机制

离线并发与锁机制

离线并发的来源

在Web项目中,离线并发显得尤其严重。例如,用户A和用户B同时修改数据库中的某张表的R行,加入R行有两个字段分别是C1,C2。

假如按照如下过程修改:

1 用户A将数据R(C1,C2)读取到A的浏览器中。

2 用户B将数据R(C1,C2)读取到B的浏览器中。

3 用户A在浏览器上将数据修改为R(C1’,C2),同时更新到数据库。

4 用户B在浏览器上将数据修改为R(C1,C2’),同时更新到数据库。

上述过程存在两个问题,第一,第4步B在修改数据的时候数据库中的数据和B的浏览器中数据已经不一致了;第二,如果程序按照哪个字段变化在数据库中更新哪个字段的方式处理的话,那么经过上述四步修改,数据库中R行的内容是(C1’,C2’),这和A或者B的想法都不同(A认为是(C1’,C2),B认为是(C1,C2’))。

上述过程中A对数据库的修改过程或者B对数据库的修改过程,都是无法根据数据库的最新内容做修改,所以成为离线。A和B同时对记录R进行就该叫离线。

以上的环境叫离线并发。
那么如何解决离线并发过程中遇到的问题呢?我们引入锁机制。

锁机制
锁机制,就是在需要修改的数据上加互斥锁,通过互斥锁避免数据被同时修改。锁机制更具其应用环境又分为乐观锁和悲观锁

乐观锁
乐观锁,指认为冲突很少发生,所以只是在数据修改的时候比较修改的基础数据和数据库中的数据是否相同,相同则修改,否则提示用户重新装入数据库中已经变化的数据。

实现方法1:在进行update的时候使用where条件,在Where标间中比较所有上一步中查询得到的数据。如果数据库中的数据没有变化,则update可以更新到内容,否则update语句不能更新到内容,可以根据update的返回值确定更新是否成功。

实现方法2:在每一个表中追加一个特殊字段,类型为timestamp,每次更新的时候比较这个字段的值是否一致,如果一致,则更新,同时将这个字段更新为当前时间,否则,说明数据已经变更。这也可以使用update加上where实现。

悲观锁
悲观锁指,需要修改的数据,在读取的时候就对数据加锁,其他用户在准备修改,读取数据的阶段判断数据是否上锁,以此来决定是否进行修改前的读操作。


实现方法:
通常在数据库中建立一张lock表,该表的字段包括,表明,唯一索引,时间,用户信息等。


在用户读取数据准备修改的时候,首先判断lock表中是否存在自己将要读取的数据。

如果不存在,则在lock表中添加一条记录,记录对那张表的哪行数据进行修改;如果存在,在判断时间字段是否超时。

如果超时,则更新lock表中本条记录的时间字段。(防止死锁的必要手段)

如果存在,也不超时,说明本条记录正在被其他用户修改,则返回并发信息。

2009年11月10日火曜日

你可能不知道的MySQL

一、"\G"的作用;
二、"Group by"的“隐形杀手”;
三、大批量数据插入;
四、最快复制表结构方法;
五、加引号和不加引号区别;
六、前缀索引;
七、MySQL索引使用方式


前言:

实验的数据表如下定义:

mysql> desc tbl_name;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| uid | int(11) | NO | | NULL | |
| sid | mediumint(9) | NO | | NULL | |
| times | mediumint(9) | NO | | NULL | |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)存储引擎是MyISAM,里面有10,000条数据。

一、"\G"的作用

mysql> select * from tbl_name limit 1;
+--------+--------+-------+
| uid | sid | times |
+--------+--------+-------+
| 104460 | 291250 | 29 |
+--------+--------+-------+
1 row in set (0.00 sec)

mysql> select * from tbl_name limit 1\G;
*************************** 1. row ***************************
uid: 104460
sid: 291250
times: 29
1 row in set (0.00 sec)有时候,操作返回的列数非常多,屏幕不能一行显示完,显示折行,试试”\G”,把列数据逐行显示(”\G”挽救了我,以前看explain语句横向显示不全折行看起来巨费劲,还要把数据和列对应起来)。

二、"Group by"的“隐形杀手”

mysql> explain select uid,sum(times) from tbl_name group by uid\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl_name
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 10000
Extra: Using temporary; Using filesort
1 row in set (0.00 sec)

mysql> explain select uid,sum(times) from tbl_name group by uid order by null\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl_name
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 10000
Extra: Using temporary
1 row in set (0.00 sec)默认情况下,Group by col会对col字段进行排序,这就是为什么第一语句里面有Using filesort的原因,如果你不需要对col字段进行排序,加上order by null吧,要快很多,因为filesort很慢的。

三、大批量数据插入

最高效的大批量插入数据的方法:

load data infile ‘/path/to/file’ into table tbl_name;

如果没有办法先生成文本文件或者不想生成文本文件,可以一次插入多行:

insert into tbl_name values (1,2,3),(4,5,6),(7,8,9)…

注意一条sql语句的最大长度是有限制的。如果还不想这样,可以试试MySQL的prepare,应该都会比硬生生的逐条插入要快许多。

如果数据表有索引,建议先暂时禁用索引:

alter table tbl_name disable keys;

插入完毕之后再激活索引:

alter table tbl_name enable keys;

对MyISAM表尤其有用。避免每插入一条记录系统更新一下索引。

四、最快复制表结构方法

mysql> create table clone_tbl select * from tbl_name limit 0;
Query OK, 0 rows affected (0.08 sec)

只会复制表结构,索引不会复制,如果还要复制数据,把limit 0去掉即可。

五、加引号和不加引号区别

给数据表tbl_name添加索引:

mysql> create index uid on tbl_name(uid);

测试如下查询:

mysql> explain select * from tbl_name where uid = '1081283900'\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl_name
type: ref
possible_keys: uid
key: uid
key_len: 4
ref: const
rows: 143
Extra:
1 row in set (0.00 sec)我们在整型字段的值上加索引,是可以用到索引的,网上不少人误传在整型字段上加引号无法使用索引。修改uid字段类型为varchar(12):

mysql> alter table tbl_name change uid uid varchar(12) not null;

测试如下查询:

mysql> explain select * from tbl_name where uid = 1081283900\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl_name
type: ALL
possible_keys: uid
key: NULL
key_len: NULL
ref: NULL
rows: 10000
Extra: Using where
1 row in set (0.00 sec)我们在查询值上不加索引,结果索引无法使用,注意安全。

六、前缀索引

有时候我们的表中有varchar(255)这样的字段,而且我们还要对该字段建索引,一般没有必要对整个字段建索引,建立前8~12个字符的索引应该就够了,很少有连续8~12个字符都相等的字段。

为什么?更短的索引意味索引更小、占用CPU时间更少、占用内存更少、占用IO更少和很更好的性能。

七、MySQL索引使用方式

MySQL在一个查询中只能用到一个索引,所以要根据查询条件建立联合索引,联合索引只有第一位的字段在查询条件中能才能使用到。

如果MySQL认为不用索引比用索引更快的话,那么就不会用索引。

mysql> create index times on tbl_name(times);
Query OK, 10000 rows affected (0.10 sec)
Records: 10000 Duplicates: 0 Warnings: 0

mysql> explain select * from tbl_name where times > 20\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl_name
type: ALL
possible_keys: times
key: NULL
key_len: NULL
ref: NULL
rows: 10000
Extra: Using where
1 row in set (0.00 sec)

mysql> explain select * from tbl_name where times > 200\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl_name
type: range
possible_keys: times
key: times
key_len: 3
ref: NULL
rows: 1599
Extra: Using where
1 row in set (0.00 sec)数据表中times字段绝大多数都比20大,所以第一个查询没有用索引,第二个才用到索引。

2009年9月29日火曜日

易经和五术

五术的(山、医、命、相、卜 )基本构成,都是源自易经,易经涵盖时空,宇宙的万事万物,都阴阳相互对立又能相互转化,如冬去春来,夏去秋来,月升日落,老死少生等等。

《山》

所包含的是修心养性、锻炼身体的秘术,是最深奥、最神秘的,也是最容易被人误解为"迷信"的一种。"山"包含《玄典》、《养生》、《修密》三部分的修习。

玄典--一切可以修身养性的好书都可以用来修习,如《老子》、《庄子》、《列子》、《孙子》、《太公阴符经》、《黄帝内经》、《道藏》甚至《西游记》等一切书籍都被拿来充实思想、参悟宇宙道理。

养生--追求健康长寿的吐纳法--气功。道家的炼丹法,称之为天丹、人丹、地丹。

修密--符咒法、压镇法、祈星法、武术等,利用运动以及精神、意念的统一来提高身心境界的方法。 也有秘术门派将"山"分为仙、道、幻、灵、兵五种方法。而其范围不离上述三部分。山是秘术中最不容易达到的境界,严格地说,它是凡人修仙道的工夫,是求超脱的形而上之追求,只有"命、卜、相、医"流在江湖凡尘济世了。


《医》

医包括三部分。

方剂--使用药物,根据表里、虚实、寒热,再应用古老的周易八卦来治疗各种疾病一种方法。如易经的阴极生阳,阳极生阴。

针灸--以《黄帝内经》、《难经》辩奇经八脉、穴道,用铜针刺穴道治疗疾病的方法。

灵疗--以催眠术、暗示法及集中精神意念,利用《祝由十三科》做药引来治疗疾病的方法。


《命》

"命"是以时间、空间的磁场来判断人的命运的一种方法。其重要的方法有:

占星术--在占星术所包含的有《七政四余》、《紫薇斗数》、《五星术》。

干支术-- 以人出生时间,年月日时以天干地支排列成命,四柱中命的部分典籍最多,重要的古籍有:《果老星宗》、《星平会海》、《渊海子平》、《鬼谷遗文》、《孙膑遗书》、《三命通会》、《穷通宝鉴》(又名栏江纲)、《滴天髓》、《神峰通考》、《铁板神数》、《河洛理数》、《子平真诠》、《子平粹言》……等等。现代人的命学著作更是汗牛充栋,不胜枚举。


《卜》

所有数术玄学以卜术最为渊源流长,历史朝代中的军事家大多精通此术,汉朝的诸葛亮、唐朝的李淳风、宋朝的邵康节、明朝的刘伯温、清朝的曾国藩……诸术以卜派最为渊源流长,从古老的周易演化而来,如《梅花易数》、《纳甲断易》、《六壬神课》、《太乙神数》、《奇门遁甲》等数术学。有的门派在卜的这一部分还包括预言、克应占梦、测字解字、签贴、姓名学等方术。


《相》

相的部分包括两种:

人相--手相、面相、体相、摸骨、痣相等,代表著作有《观人于微》、《相理衡真》、《神相铁关刀》、《水镜神相》、《麻衣神相》、《金铰剪》等。

地相--地相就是古时的《堪舆术》,分为看门井灶的阳宅相法与看龙穴砂水向的阴宅相法,一般称为风水术。其主要的流派有《三元法》、《三合法》、《九星法》等。

2009年9月16日水曜日

沁园春.学愁

沁园春

学愁

学海无涯
徒有孤舟
独自漂流
悔平庸岁月
虚度难留
人非草木
孰无杂念
七情六欲
爱恨情愁
何日脱俗成学究
叹古今
问君子名流
几人无求

谁不望子成龙
盼儒子扬鞭登金楼
恐骄儿受苦
生来娇宠
群人拥簇
何日得休
拈轻怕重
胆小如鼠
怎扼命运之咽喉
学之愁
问成人学子
几人能守

胡祥春

丁丑年于柴河

注:
丁丑年:1997年
柴河:黑龙江省海林市柴河

2009年9月14日月曜日

国外 对云计算、SAAS炒作的看法摘录

面对越来越大的经济压力,大大小小的公司在寻求云计算,以缓解压力。这个流行语无处不在:云计算能降低成本、加快实施、迅速扩展。然而,这个流行语可能有点不切题,至少厂商推销产品时是这样。
  开源SOA提供商MuleSource公司的联合创办人兼首席技术官Ross Mason说:“正如SOA由厂商炒作起来,因而变得更像是一个营销用语,而不是准确描述了架构;这一幕同样会出现在2009年的云计算身上,完全是重炒作、轻实用。”

在对于软件即服务(SaaS)和云计算之间区别上KenRudin认为:虽然营销信息模糊了大多数的区别,但其实这二者还是有不同的。云计算是一个总括的概念,这意味着在互联网上提供各种数据中心服务。这包括计算和CPU资源(例子之一就是Amazon的EC2服务)、网络存储服务、在线软件开发平台(如Salesforce.com的Force.Com平台)。还包括云计算在互联网上提供应用程序,如Salesforce.com的CRM解决方案,NetSuite的ERP解决方案,以及LucidEra的商业智能应用程序。在互联网上提供应用程序就是通常的SaaS或“需求”应用程序。SaaS应用程序在今天有着广泛的应用,涵盖几乎所有的应用类程序

对技术人员而言,云计算意味着网格计算、公用计算、软件即服务(SaaS)、虚拟化、基于互联网的应用、自主计算、对等计算、按需处理和远程处理,以及这些术语的各种组合。这些都是Fingar所谓的“信息工厂”(information factories)的方面。

对非技术人员而言,云计算只是一个平台,个人和公司使用互联网来访问不计其数的硬件、软件和数据资源,以满足自己的大多数计算要求,用Fingar的话来说,就是“把麻烦扔给云服务提供商(CSP)去处理”。

  CIO并不是惟一为云计算问题而担心的管理人员。Avanade公司云计算战略高级主管Larry Beck说:“我们调查的一项主要结果表明,尽管需要降低成本,但大多数公司还是没有采用云计算,即便它们认识到云计算是降低先期成本和日常成本的一种切实可行的方案。担心安全以及对数据和系统失去控制权在阻碍采用。”

  另一个方面也很麻烦:法规监管问题。

  即将出版的《云计算手册》(Cloud Computing Handbook)一书合著者Anthony Velte说:“如果你想使用云计算,把需要遵从《健康保险可携性及责任性法案》(HIPAA)的数据发布到云上,就要认真考虑这么做是否符合法规。 HIPAA数据可能与另一家企业的数据在同一台服务器上混合起来,这可能会引起留心观察的HIPAA审计人员的注意。”

  Velte补充说:“如果你的数据受制于HIPPA或《萨班斯-奥克斯利法案》这样的法规,在制定把数据放到云上的计划时最好要非常慎重。毕竟,如果你把客户的财务数据发布到云上,要是出现了泄密,客户会找云服务提供商还是会找你?”

  结果证明,云计算其实受到地理边界的限制。你把自己的信息发布到云上也许是违法的。Velte说:“比方说如果你在加拿大境内,你想把自己的数据发布到美国的云上,就可能违反加拿大法律。”

  加拿大政府已宣布,政府部门的IT员工不得使用在美国境内运行的网络服务。他说:“原因在于,按照美国《爱国者法》,保存在美国境内服务器上的加拿大数据可能会受到不利影响。在美国境外运行的云也是如此。你可能不知道法律在监管你数据在外国的隐私和保护。”

 Akibia公司的技术副总裁Robert Klotz说:“云计算面临的挑战在于,只有几个应用是真正作为Web 2.0解决方案针对云计算而构建的。软件即服务解决方案很接近,但它们不是真正的Web 2.0解决方案。”

暴雪娱乐昨日决定在新版《星际争霸2》中放弃局域网对战功能,但用户可以通过接入基于云计算技术的战网(Battle.net)平台实现对战。不过,部分用户对暴雪的这一决定感到不满,因为云计算平台会导致延迟及其他问题。

麦肯斯最近发布的一份白皮书显示,只有在云中使用Linux等特定平台时,用户才有可能省钱。如果需要一整个数据中心,最好的方法还是内部搭建。还有一个因素是,在当前的授权和支持模式中,如果用户将商业软件部署到云中,那么他们所支付的费用将远大于内部使用的费用。

即使云计算厂商已经事无巨细,但仍然无法保证用户服务器、应用和网络的绝对安全。当零售商或刷卡机遵守信用卡行业的PCI DSS标准时,那么它部署在亚马逊或谷歌等云计算平台上的服务器和应用就会受到审查。斯塔滕说,如果你的应用安装的不好,那么平台再安全也没用。

西门子的云计算服务则会从里到外检查每一个可能访问用户关键信息的路径。科拉尔说,确保每个平台的安全并不难,难的是让所有必要的安全技术相互协调。

斯塔滕说,用户需要对云计算厂商进行仔细审核,以便确保不存在不当行为。例如,将每个用户的表格空间都设置在同一数据库中,使得客户之间能够相互查看彼此的用户数据。

与传统方式相比,在云计算服务中,通过一块新网卡将虚拟机接入到不安全的网络要容易得多。因此,对云计算厂商进行独立的审核就显得非常重要,绝对不能盲目相信云计算厂商的安全性。

2009年9月12日土曜日

查看和清除Oracle数据库锁定

create or replace function getDay(parm1 varchar2) return varchar2
is Result varchar2(1000);
begin
Result:='my name is '||parm1;
return(Result);
end getDay;


create or replace function devib2.getMessage(messageId varchar2) return varchar2 is
Result varchar2(1000);
begin
select msg1.message into Result from B00A00DB00001 msg ,B00A00DB00002 msg1
where msg.error_code in(messageId)
and msg.view_message_id = msg1.message_id
and rownum = 1;
return(Result);
end getMessage;


select getMessage('A01EG00002') from dual

Debian下配置Samba服务器

apt-get install samba

输入工作组名,或者域名:workgroup。

cd /etc/samba/

testparm

mv /etc/samba/smb.conf smb.conf.backup

vim /etc/samba/smb.conf

------------------------------------------

[global]

log file = /var/log/samba/log.%m

[tmp]

comment = Temporary file space

path = /tmp

read only = no



smb passwd file = /etc/samba/smbpasswd



security = share



------------------------------------------

/etc/init.d/samba restart

useradd hxcname

touch /etc/samba/smbpasswd

chmod 777 smbpasswd



smbpasswd -a hxcname

  New SMB password:

  Retype new SMB password:





这时,kanaka就被写进了/etc/samba/smbpasswd文件,hxname就可以从windows访问samba了。



7.测试



在你的Windows里面,找到网上邻居的debian,用刚才创建的用户,访问它,并向tmp目录拷贝一个文件。怎么样,可以了吧。