仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 621|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL编程:MySQL 4.1.0 中文参考手册 --- 6.7 MyS...

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:45:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
无疑希望员工得到系统、有深度的培训,显然MySQL在这一点上还做得很不够。mysql|参考|参考手册|中文MySQL4.1.0中文参考手册---犬犬(心帆)翻译MySQLReferenceManualforversion4.1.0-alpha.

6.7MySQL事件与锁天命令6.7.1BEGIN/COMMIT/ROLLBACK句法


缺省的,MySQL运转在autocommit形式。这就意味着,当你实行完一个更新时,MySQL将立即将更新存储到磁盘上。

假如你利用事件平安表(比方InnoDB、BDB),经由过程上面的命令,你能够设置MySQL为非autocommit形式:

SETAUTOCOMMIT=0

在此以后,你必需利用COMMIT来存储你的变动到磁盘上,大概利用ROLLBACK,假如你但愿疏忽从你的事件入手下手所做的变动。

假如你但愿为一系列语句从AUTOCOMMIT形式转换,你可使用STARTTRANSACTION或BEGIN或BEGINWORK语句:

STARTTRANSACTION;SELECT@A:=SUM(salary)FROMtable1WHEREtype=1;UPDATEtable2SETsummmary=@AWHEREtype=1;COMMIT;

STARTTRANSACTION在MySQL4.0.11中被到场;这是被保举的入手下手一个出格(ad-hoc)事件的体例,由于这是ANSISQL句法。

注重,假如你利用的是一个非事件平安表,变动会立即被存储,不受autocommit形式形态的束缚。

当你更新了一个非事件表后,假如你实行一个ROLLBACK,你将失掉一个毛病(ER_WARNING_NOT_COMPLETE_ROLLBACK)作为一个告诫。一切事件平安表将被恢复,可是非事件平安表将不会改动。

假如你利用STARTTRANSACTION或SETAUTOCOMMIT=0,你应当利用MySQL二进制日记做备份以取代老的更新日记。事件处置被以一个年夜块情势存储在二进制日记中,在COMMIT下面,为了回护回滚的事件,而不是被存储的。检察章节4.9.4二进制日记。假如您利用起动事件处置或集AUTOCOMMIT=0,您应当利用MySQL二进制日记为备份取代更旧的更新日记。事件处置存储在二进制登录一年夜块,做,包管,滚的事件处置不存储。拜见部分4。9.4二进制日记。

以下命令主动的停止一个事件(就仿佛你在实行这个命令之前,做了一个COMMIT):
命令命令命令ALTERTABLEBEGINCREATEINDEXDROPDATABASEDROPTABLERENAMETABLETRUNCATE
你可使用SETTRANSACTIONISOLATIONLEVEL...改动事件的断绝级。检察章节6.7.3SETTRANSACTION句法。
6.7.2LOCKTABLES/UNLOCKTABLES句法


LOCKTABLEStbl_name[ASalias]{READ[LOCAL]|[LOW_PRIORITY]WRITE}[,tbl_name[ASalias]{READ[LOCAL]|[LOW_PRIORITY]WRITE}...]...UNLOCKTABLES

LOCKTABLES为以后线程锁定表。UNLOCKTABLES开释以后线程具有的一切锁定。当线程收回另外一个LOCKTABLES,或当与服务器的毗连被封闭时,被以后线程锁定的一切表将被主动地解锁。

为了在MySQL4.0.2利用LOCKTABLES,你必需具有一个全局的LOCKTABLES权限和一个在相干表上的SELECT权限。在MySQL3.23中,你对该表必要有SELECT、insert、DELETE和UPDATE权限。

利用LOCKTABLES的次要缘故原由是,仿效事件处置或在更新表时失掉更快的速率。今后会有更具体的形貌。

假如一个线程在一个表上失掉一个READ锁,该线程(和一切别的线程)只能从表中读取。假如一个线程在一个表上失掉一个WRITE锁,那末只要具有这个锁的线程能够从表中读取和写表。别的的线程被堵塞。

READLOCAL和READ之间的分歧就在于,当锁被加载时,READLOCAL同意非抵触(non-conflicting)INSERT语句实行。假如当你加载着锁时从MySQL内部操纵数据库文件,这将仍不克不及被利用。

当你利用LOCKTABLES是地,你必需锁定一切你将利用的表,而且必需利用与你的查询中将利用的别号不异!假如你在一个查询中屡次利用一个表(用别号),你必需为每个别号取得一个锁。

WRITE锁经由过程比READ锁有更高的权限,以确保更新被尽快地处置。这就意味着,假如一个线程取得一个READ锁,而同时别的一个线程哀求一个WRITE锁,并发的READ锁哀求将守候直到WRITE线程失掉了锁并开释了它。你可使用LOW_PRIORITYWRITE锁,当该线程在守候WRITE锁时,它将同意别的的线程取得READ锁。你应当只利用LOW_PRIORITYWRITE锁,假如你确信这将是最初一次,当没有线程将具有READ锁。

LOCKTABLES事情以下:之内部界说的序次排序一切被锁定的表(从用户态度说,该序次是不明白的)。假如一个表被以一个读锁和一个写锁锁定,将写锁放在读锁之前。一次只锁定一个表,只到线程失掉一切的锁定。
这个计划是为了确保,表锁定逝世锁开释。关于这个形式你仍旧有些别的事变必要晓得:

假如你对一个表利用一个LOW_PRIORITYWRITE锁定,这就意味着,MySQL将守候这个锁,直到没有线程哀求一个READ锁。当线程失掉了WRITE锁,并守候取得锁定表列表中的下一个表的锁准时,别的一切的线程将守候WRITE锁被开释。假如这在你的使用程序中会引发一个严峻的成绩,你应当思索将你的某些表转换为事件平安表。

你可使用KILL平安地杀逝世一个正在表锁定的线程。检察章节4.5.5KILL句法。

注重,你不该该锁定你正在对其利用INSERTDELAYED的表。这是由于,在这类情形下,INSERT是经由过程独自的线程完成的。

一般,你不必要锁定任何表,由于一切单UPDATE语句都是原子的;别的的线程没法搅扰以后实行的SQL语句。当你不管怎样但愿锁定表时,这里有一些情形:
假如你在一束表上运转很多操纵,锁定你将要利用的表,这会更快一些。固然有倒霉的方面,别的线程将不克不及更新一个READ锁的表,而且没有别的线程要以读取一个WRITE锁的表。在LOCKTABLES下,某些事运转得更快一些的缘故原由是,MySQL将不会转储扫除被锁定表键高速缓冲,直到UNLOCKTABLES被挪用(一般键高速缓冲在每一个SQL语句后城市被转储扫除)。这将减速在MyISAM表上的拔出、更新、删除。

假如你在MySQL中正在利用一个不撑持事件的存储引擎,假如你但愿能确保没有别的的线程会呈现在一个SELECT和一个UPDATE之间,你必需利用LOCKTABLES。上面的示例显现为了平安地实行,这里必要LOCKTABLES:
mysql>LOCKTABLEStransREAD,customerWRITE;mysql>SELECTSUM(value)FROMtransWHEREcustomer_id=some_id;mysql>UPDATEcustomerSETtotal_value=sum_from_previous_statement->WHEREcustomer_id=some_id;mysql>UNLOCKTABLES;
不利用LOCKTABLES,将大概产生在SELECT和UPDATE语句实行时代有别的一个线程大概在trans表中拔出一行新纪录。
经由过程利用递增更新(UPDATEcustomerSETvalue=value+new_value)或LAST_INSERT_ID()函数,你能够在良多情形下制止利用LOCKTABLES。

你也能够利用用户级锁定函数GET_LOCK()和RELEASE_LOCK()办理一些情形,这些锁被保留在服务器上的一个哈希表中,并以pthread_mutex_lock()和pthread_mutex_unlock()完成以取得高速率。检察章节6.3.6.2帮助功效函数。

检察章节5.3.1MySQL怎样锁定表,以猎取关于锁定计划的更多信息。

你可使用FLUSHTABLESWITHREADLOCK命令以读锁锁定一切数据库中的一切表。检察章节4.5.3FLUSH句法。假如你有一个能够实时创建文件快照的文件体系,比方Veritas,这将是失掉备份的十分便利体例。

注重:LOCKTABLES不是事件平安的,在实验锁定一个表之前,将主动地提交一切的举动事件。
6.7.3SETTRANSACTION句法


SET[GLOBAL|SESSION]TRANSACTIONISOLATIONLEVEL{READUNCOMMITTED|READCOMMITTED|REPEATABLEREAD|SERIALIZABLE}

设置全局的、全部会话或下一个事件的事件断绝级。

缺省举动是设置下一个(未启动的)事件的断绝级。假如你利用GLOBAL关头词,语句为一切在谁人点上创建的新毗连设置默许的全局事件断绝级。为了如许做,你必要有SUPER权限。利用SESSION关头词为以后毗连一切未来实行的事件设置默许的事件断绝级。

你可使用--transaction-isolation=...为mysqld设置默许的全局断绝级。检察章节4.1.1mysqld命令行选项。
能够以较低的成本向客户提供IT所有权,当节约成本成为客户最高优先级时,解决方案提供商可以向更多的客户同时提供服务。虽然有许多来自RDBMS固有的局限性。
透明 该用户已被删除
沙发
发表于 2015-1-19 22:28:36 | 只看该作者
varchar(max)\\\\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。
不帅 该用户已被删除
板凳
发表于 2015-1-25 07:42:37 | 只看该作者
我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
只想知道 该用户已被删除
地板
发表于 2015-2-2 15:34:45 | 只看该作者
如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。
小妖女 该用户已被删除
5#
发表于 2015-2-7 23:29:00 | 只看该作者
数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。
第二个灵魂 该用户已被删除
6#
发表于 2015-2-23 16:31:11 | 只看该作者
代替了原来VB式的错误判断。比Oracle高级不少。
再见西城 该用户已被删除
7#
发表于 2015-3-7 09:35:55 | 只看该作者
SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。)
分手快乐 该用户已被删除
8#
发表于 2015-3-14 18:54:05 | 只看该作者
可以动态传入参数,省却了动态SQL的拼写。
精灵巫婆 该用户已被删除
9#
发表于 2015-3-21 13:41:22 | 只看该作者
学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 03:21

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表