悲观锁和乐观锁

悲观锁和乐观锁 为什么需要锁 (并发控制) ? 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。 典型的冲突有: 丢失更新: 一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。例如: 用户A把值从 6 改为 2, 用户B把值从 2 改为 6, 则用户 A 丢失了他的更新。 脏读: 当一个事务读取其它完成一半事务的记录时, 就会发生脏读取。例如: 用户 A, B 看到的值都是 6, 用户 B 把值改为 2, 用户 A 读到的值仍为 6。 为了解决这些并发带来的问题。 我们需要引入并发控制机制。 并发控制机制 最常用的处理多用户并发访问的方法是加锁。当一个用户锁住数据库中的某个对象时,其他用户就不能再访问该对象。加锁对并发访问的影响体现在锁的粒度上。比如,放在一个表上的锁限制对整个表的并发访问;放在数据页上的锁限制了对整个数据页的访问;放在行上的锁只限制对该行的并发访问。可见行锁粒度最小,并发访问最好,页锁粒度最大,表锁介于2者之间。 悲观锁 悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。 假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。悲观锁假定其他用户企图访问或者改变你正在访问、更改的对象的概率是很高的,因此在悲观锁的环境中,在你开始改变此对象之前就将该对象锁住,并且直到你提交了所作的更改之后才释放锁。悲观的缺陷是不论是页锁还是行锁,加锁的时间可能会很长,这样可能会长时间的限制其他用户的访问,也就是说悲观锁的并发访问性不好。 乐观锁 乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据: 如果别人修改了数据则放弃操作,否则执行操作。 假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。乐观锁不能解决脏读的问题。乐观锁则认为其他用户企图改变你正在更改的对象的概率是很小的,因此乐观锁直到你准备提交所作的更改时才将对象锁住,当你读取以及改变该对象时并不加锁。可见乐观锁加锁的时间要比悲观锁短,乐观锁可以用较大的锁粒度获得较好的并发访问性能。但是如果第二个用户恰好在第一个用户提交更改之前读取了该对象,那么当他完成了自己的更改进行提交时,数据库就会发现该对象已经变化了,这样,第二个用户不得不重新读取该对象并作出更改。这说明在乐观锁环境中,会增加并发用户读取对象的次数。 从数据库厂商的角度看,使用乐观的页锁是比较好的,尤其在影响很多行的批量操作中可以放比较少的锁,从而降低对资源的需求提高数据库的性能。再考虑聚集索引。在数据库中记录是按照聚集索引的物理顺序存放的。如果使用页锁,当两个用户同时访问更改位于同一数据页上的相邻两行时,其中一个用户必须等待另一个用户释放锁,这会明显地降低系统的性能。interbase和大多数关系数据库一样,采用的是乐观锁,而且读锁是共享的,写锁是排他的。可以在一个读锁上再放置读锁,但不能再放置写锁;你不能在写锁上再放置任何锁。锁是目前解决多用户并发访问的有效手段。 乐观锁应用 使用自增长的整数表示数据版本号。更新时检查版本号是否一致,比如数据库中数据版本为6,更新提交时version=6+1,使用该version值(=7)与数据库version+1(=7)作比较,如果相等,则可以更新,如果不等则有可能其他程序已更新该记录,所以返回错误。 使用时间戳来实现. 注: 对于以上两种方式,Hibernate自带实现方式: 在使用乐观锁的字段前加 annotation: @Version, Hibernate在更新时自动校验该字段。 java中的乐观锁基本都是通过CAS操作实现的 悲观锁应用 结论 在实际生产环境里边,如果并发量不大且不允许脏读,可以使用悲观锁解决并发问题;但如果系统的并发非常大的话,悲观锁定会带来非常大的性能问题,所以我们就要选择乐观锁定的方法. 参考文档 [1]Concurrent Control http://en.wikipedia.org/wiki/Concurrency_control [2] Oracle的悲观锁和乐观锁http://space.itpub.net/12158104/viewspace-374745 [3] timestamp应用——乐观锁和悲观锁【转】http://hi.baidu.com/piaokes/blog/item/9b0c6854e4909050564e00b3.html 事务隔离 https://www.cnblogs.com/kismetv/p/10787228.html http://www.cnblogs.com/Bob-FD/p/3352216.html

2012-11-01 · 1 min · 71 words · lcf

sql command

sql command -- http://www.wiloon.com/?p=1899 insert into t1 values (1,'1',1) on duplicate key update c0=c0+1; INSERT INTO "表格名" ("栏位1", "栏位2", ...) VALUES ("值1", "值2", ...);

2012-10-29 · 1 min · 24 words · lcf

细化解析 不同类型数据库的死锁问题

细化解析 不同类型数据库的死锁问题 论坛中有很多关于死锁问题的讨论,在理论方面,R.Ramakrishnan的《Database management systems》也有非常精辟的阐述。就实际开发而言,不同的数据库环境有着不同的处理方法,不同的体系架构也会导致不同的结果,下面来简单介绍一下不同类型数据库的死锁问题。 1.MSSQL、DB2、Oracle之类的现代DBMS或者中间件可以帮助我们自动解决绝大部分死锁,其余一部分难以处理的死锁则由DBA在数据库控制端手工处理。就应用程序而言,不需要在源代码级过多考虑地考虑死锁问题。 2.死锁的发生对系统的性能和吞吐量有着明显的影响,但只要存在针对共享数据资源的大规模并发访问的情况,那么死锁是不可避免的。 理论上,预防死锁的最好的途径是: 给每一个transaction设定一个优先级,同时确保较低优先级的事务不必等待较高优先级事务释放共享资源,反过来,也确保较高优先级的事务能够立刻取得相应的资源。如果开发人员无法判别事务的优先级,那么可以考虑在每个事务开始时赋予它一个的时间戳,依据时间戳的先后来判定事务的优先级,这类似于FIFO队列。在这方面,现代DBMS都提供了相应的语言支持。但是,假设由于网络故障而导致高优先级的事务无法commit或者rollback,那么是否其他低级别事务便要一直等待或者被抛弃?或者一个事务中的update操作施加了多个表级锁,并且占用了大量时间,那么即便这种事务从逻辑上并不合理,是否也要保持它的高优先级? 针对稀缺资源的竞争在任何场合都是正常的,死锁出现的因果关系给予我一个提示,就是不能盲目地依赖DBMS和DBA在死锁发生后再去解决死锁问题,那样必然已经对用户体验造成了消极影响。开发人员在设计过程中,需要更多地研判可能的并发访问问题。这些问题可能包括: 尽可能缩短事务。在同一DB中并发执行多个需要长时间运行的事务时,发生死锁的概率较大。事务运行时间越长,其持有exclusive锁或update锁的时间便越长,从而堵塞了其它活动并可能导致死锁。保持事务在一个批处理中,可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁。同时,涉及多个表的查询更新操作,若比较耗时,尽量不要放在一个事务内处理,能分割便分割。若不能分割,便尽可能使之在业务量较小的时间(例如子夜或者午餐时间)执行。 尽可能按同一顺序访问数据对象。如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。 避免编写包含用户交互的事务。因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度,若用户不能及时反馈,则此事务将挂起。因而将严重降低系统的吞吐量,因为事务持有的任何锁只有在事务提交或回滚时才会释放。即使不出现死锁的情况,访问同一资源的其它事务也会被阻塞,等待该事务完成。 使用低隔离级别。确定事务是否能在更低的隔离级别上运行。执行提交读允许事务读取另一个事务已读取 (未修改) 的数据,而不必等待第一个事务完成。使用较低的隔离级别 (例如提交读) 而不使用较高的隔离级别 (例如可串行读) 可以缩短持有共享锁的时间,从而降低了锁定争夺。 考虑体系结构的优化与代码重构,提高系统整体的运行效率。例如尽可能不要采用类似EJB的效率低下的计算模型,或者将复杂的业务置于编译存储过程中执行。 通过程序控制事务提交的时机。如果一次检索出了10万条记录但只更改了其中的100条,就可以通过代码来执行100个update。或是用分段提交,即所有的修改使用多个事务进行提交,但这样会使事务不完整,应酌情使用。 将经常更新的数据库和查询数据库分开。定期将不改变的数据导入查询数据库中,这样查询和更新就可以分开进行,而降低死锁机率。 在进行数据库模式设计时,注意外键引用的完整性,并对外键加索引。如果更新了父表的主键,由于外键上没有索引,所以子表会被锁定;如果删除了父表中的一行,整个子表也会被锁定。

2012-10-24 · 1 min · 24 words · lcf

六个方法解决应用程序中死锁现象的出现

六个方法解决应用程序中死锁现象的出现 在应用程序中就可以采用下面的一些方法来避免死锁: (1) 合理安排表访问顺序。 (2) 在事务中尽量避免用户干预,尽量使一个事务处理的任务少些, 保持事务简短并在一个批处理中。 (3) 数据访问时域离散法, 数据访问时域离散法是指在客户机/服务器结构中,采取各种控制手段控制对数据库或数据库中的对象访问时间段。主要通过以下方式实现: 合理安排后台事务的执行时间,采用工作流对后台事务进行统一管理。工作流在管理任务时,一方面限制同一类任务的线程数 (往往限制为1个) ,防止资源过多占用; 另一方面合理安排不同任务执行时序、时间,尽量避免多个后台任务同时执行,另外, 避免在前台交易高峰时间运行后台任务。 (4) 数据存储空间离散法。数据存储空间离散法是指采取各种手段,将逻辑上在一个表中的数据分散到若干离散的空间上去,以便改善对表的访问性能。主要通过以下方法实现: 第一,将大表按行或列分解为若干小表; 第二,按不同的用户群分解。 (5) 使用尽可能低的隔离性级别。隔离性级别是指为保证数据库数据的完整性和一致性而使多用户事务隔离的程度,SQL92定义了4种隔离性级别: 未提交读、提交读、可重复读和可串行。如果选择过高的隔离性级别,如可串行,虽然系统可以因实现更好隔离性而更大程度上保证数据的完整性和一致性,但各事务间冲突而死锁的机会大大增加,大大影响了系统性能。 (6) 使用绑定连接, 绑定连接允许两个或多个事务连接共享事务和锁,而且任何一个事务连接要申请锁如同另外一个事务要申请锁一样,因此可以允许这些事务共享数据而不会有加锁的冲突。

2012-10-24 · 1 min · 25 words · lcf

如何解决数据库中的死锁问题

如何解决数据库中的死锁问题 说道死锁问题的解决,一般情况下我们都是选择KILL进程,但如果不查出引起死锁的原因,死锁的现象则会频繁出现,其实只要通过查找引起死锁的操作,就可以方便的解决死锁。 **具体的解决方法如下: ** 1.再死锁发生时,我们可以通过下面的语法,查询到引起死锁的操作: use master go declare @spid int,@bl int DECLARE s_cur CURSOR FOR select 0 ,blocked from (select * from sysprocesses where blocked>0 ) a where not exists(select * from (select * from sysprocesses where blocked>0 ) b where a.blocked=spid) union select spid,blocked from sysprocesses where blocked>0 OPEN s_cur FETCH NEXT FROM s_cur INTO @spid,@bl WHILE @@FETCH_STATUS = 0 begin if @spid =0 select ‘引起数据库死锁的是: ‘+ CAST(@bl AS VARCHAR(10)) + ‘进程号,其执行的SQL语法如下’ ...

2012-10-24 · 2 min · 220 words · lcf

死锁 (Deadlocks)

死锁 (Deadlocks) deadlocks (死锁) 所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程. 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。 一种情形,此时执行程序中两个或多个线程发生永久堵塞 (等待) ,每个线程都在等待被其他线程占用并堵塞了的资源。例如,如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。 计算机系统中,如果系统的资源分配策略不当,更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。 产生死锁的原因主要是: (1) 因为系统资源不足。 (2) 进程运行推进的顺序不合适。 (3) 资源分配不当等。 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则 就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。 产生死锁的四个必要条件: (1) 互斥条件: 一个资源每次只能被一个进程使用。 (2) 请求与保持条件: 一个进程因请求资源而阻塞时,对已获得的资源保持不放。 (3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之 一不满足,就不会发生死锁。 死锁的解除与预防: 理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和 解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确 定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态 的情况下占用资源,在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,若分配后系统可能发生死锁,则不予分配,否则予以分配 。因此,对资源的分配要给予合理的规划。

2012-10-24 · 1 min · 39 words · lcf

sqlite 数据类型

sqlite 数据类型 一般数据采用的固定的静态数据类型,而 SQLite 采用的是动态数据类型,会根据存入值自动判断。SQLite 具有以下五种数据类型: NULL: 空值。 INTEGER: 带符号的整型,具体取决有存入数字的范围大小 REAL: 浮点数字,存储为8-byte IEEE浮点数 TEXT: 字符串文本 BLOB: 二进制对象 但实际上,sqlite3 也接受如下的数据类型: smallint 16 位元的整数 interger 32 位元的整数 decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。 float 32位元的实数。 double 64位元的实数。 char(n) n 长度的字串,n不能超过 254。 varchar(n) 长度不固定且其最大长度为 n 的字串,n 不能超过 4000。 graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。 vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000 date 包含了 年份、月份、日期。 time 包含了 小时、分钟、秒 timestamp 包含了 年、月、日、时、分、秒、千分之一秒 datetime DATETIME 类型用于存储日期和时间信息。它的格式通常是 “YYYY-MM-DD HH:MM:SS” ...

2012-07-08 · 1 min · 134 words · -

adb shell sqlite DB

adb shell sqlite DB 在Android应用程序开发中,我们有时可能会用到系统中自带内嵌的数据库sqlite3,例如我们在某个应用程序中创建了数据库,如何查看该数据库或者如何查看该数据库中包含有哪些表或数据。下面是我在应用程序中创建了一个数据库以及表,如何采用命令行的方式去查看该数据库和表 cd /data/data/com.wiloon.android.rsslab/databases sqlite3 RssLab .tables select * from tag; com.wiloon.android.rsslab 是包名. RssLab 是数据库名. tag: 表名 .exit 退出. 查看字段名 .header on 查看sqlite3表结构的命令 在android下通过adb shell命令可以进入sqlite3的命令行client,见: 在android命令行下使用sqlite3。 如果想列出该数据库中的所有表,可: .table 如果想查看这些表的结构: select * from sqlite_master where type=“table”; 可以看到类似: 默认情况下,不会出现红框中的表头,需要之前设置,命令为: .header on 如果只想查看具体一张表的表结构,比如查看emperors表,命令为: select * from sqlite_master where type=“table” and name=“emperors”; 另外,也可以这样: sqlite> .schema emperors CREATE TABLE emperors( id integer primary key autoincrement, name text,dynasty text,start_year text); http://marshal.easymorse.com/index.html%3Fp=2981.html

2012-07-08 · 1 min · 68 words · -

Database – DDL,DML,DCL,TCL

Database – DDL,DML,DCL,TCL DDL (Data Definition Language) 数据库定义语言statements are used to define the database structure or schema. DDL是SQL语言的四大功能之一。 用于定义数据库的三级结构,包括外模式、概念模式、内模式及其相互之间的映像,定义数据的完整性、安全控制等约束 DDL不需要commit. CREATE ALTER DROP TRUNCATE COMMENT RENAME DML (Data Manipulation Language) 数据操纵语言statements are used for managing data within schema objects. 由DBMS提供,用于让用户或程序员使用,实现对数据库中数据的操作。 DML分成交互型DML和嵌入型DML两类。 依据语言的级别,DML又可分成过程性DML和非过程性DML两种。 需要commit. SELECT INSERT UPDATE DELETE MERGE CALL EXPLAIN PLAN LOCK TABLE 3.DCL (Data Control Language) 数据库控制语言 授权,角色控制等 GRANT 授权 REVOKE 取消授权 4.TCL (Transaction Control Language) 事务控制语言 SAVEPOINT 设置保存点 ...

2012-07-01 · 2 min · 400 words · -

SQL99

SQL99 来自ITwiki,开放的信息技术大百科 http://wiki.ccw.com.cn/SQL99 SQL99是数据库的一个ANSI/ISO标准。这个标准的前身是SQL92 ANSI/ISO标准,而SQL92之前还有一个SQL89 ANSI/ISO标准。它定义了一种语言 (SQL) 以及数据库的行为 (事务、隔离级别等) 。你知道许多商业数据库至少在某种程度上是符合SQL99的吗?不过,这对于查询和应用的可移植性没有多大的意义,这一点你也清楚吗? SQL92标准有4个层次: q 入门级 (Entry level) 。这是大多数开发商符合的级别。这一级只是对前一个标准SQL89稍做修改。所有数据库开发商都不会有更高的级别,实际上,美国国家标准和技术协会NIST (National Institute of Standards and Technology,这是一家专门检验SQL合规性的机构) 除了验证入门级外,甚至不做其他的验证。Oracle 7.0于1993年通过了NIST的SQL92入门级合规性验证,那时我也是小组中的一个成员。如果一个数据库符合入门级,它的特性集则是Oracle 7.0的一个功能子集。 q 过渡级。这一级在特性集方面大致介于入门级和中间级之间。 q 中间级。这一级增加了许多特性,包括 (以下所列并不完整) : n 动态SQL n 级联DELETE以保证引用完整性 n DATE和TIME数据类型 n 域 n 变长字符串 n CASE表达式 n 数据类型之间的CAST函数 q 完备级。增加了以下特性 (同样,这个列表也不完整) : n 连接管理 n BIT串数据类型 n 可延迟的完整性约束 n FROM子句中的导出表 n CHECK子句中的子查询 n 临时表 入门级标准不包括诸如外联结 (outer join) 、新的内联结 (inner join) 语法等特性。过渡级则指定了外联结语法和内联结语法。中间级增加了更多的特性,当然,完备级就是SQL92全部。有关SQL92的大多数书都没有区别这些级别,这就会带来混淆。这些书只是说明了一个完整实现SQL92的理论数据库会是什么样子。所以无论你拿起哪一本书,都无法将书中所学直接应用到任何SQL92数据库上。关键是,SQL92最多只达到入门级,如果你使用了中间级或更高级里的特性,就存在无法"移植"应用的风险。 SQL99只定义了两级一致性: 核心 (core) 一致性和增强 (enhanced) 一致性。SQL99力图远远超越传统的"SQL",并引入了一些对象—关系构造 (数组、集合等) 。它包括SQL MM (多媒体,multimedia) 类型、对象—关系类型等。还没有哪个开发商的数据库经认证符合SQL99核心级或增强级,实际上,据我所知,甚至没有哪个开发商声称他们的产品完全达到了某级一致性。 对于不同的数据库来说,SQL语法可能存在差异,实现有所不同,同一个查询在不同数据库中的性能也不一样,不仅如此,还存在并发控制、隔离级别、查询一致性等问题。我们将在第7章详细讨论这些问题,并介绍不同数据库的差异对你会有什么影响。 SQL92/SQL99试图对事务应如何工作以及隔离级别如何实现给出一个明确的定义,但最终,不同的数据库还是有不同的结果。这都是具体实现所致。在一个数据库中,某个应用可能会死锁并完全阻塞。但在另一个数据库中,同样是这个应用,这些问题却有可能不会发生,应用能平稳地运行。在一个数据库中,你可能利用了阻塞 (物理串行化) ,但在另一个数据库上部署时,由于这个数据库不会阻塞,你就会得到错误的答案。要将一个应用部署在另一个数据库上,需要花费大量的精力,付出艰辛的劳动,即使你100%地遵循标准也不例外。 关键是,不要害怕使用开发商特有的特性,毕竟,你为这些特性花了钱。每个数据库都有自己的一套"技巧",在每个数据库中总能找到一种完成操作的好办法。要使用最适合当前数据库的做法,移植到其他数据库时再重新实现。要使用合适的编程技术,从而与这些修改隔离,我把这称为防御式编程 (defensive programming) 。 取自"http://wiki.ccw.com.cn/SQL99"

2012-07-01 · 1 min · 88 words · -

SQL92

SQL92 http://baike.baidu.com/view/1889818.htm SQL92是数据库的一个ANSI/ISO标准 这个标准的前身是SQL92 ANSI/ISO标准,而SQL92之前还有一个SQL89 ANSI/ISO标准。 它定义了一种语言 (SQL) 以及数据库的行为 (事务、隔离级别等) 。你知道许多商业数据库至少在某种程度上是符合SQL92的吗?不过,这对于查询和应用的可移植性没有多大的意义,这一点你也清楚吗? SQL92标准有4个层次 入门级 (Entry level) 。 这是大多数开发商符合的级别。这一级只是对前一个标准SQL89稍做修改。所有数据库开发商都不会有更高的级别,实际上,美国国家标准和技术协会NIST (National Institute of Standards and Technology,这是一家专门检验SQL合规性的机构) 除了验证入门级外,甚至不做其他的验证。Oracle 7.0于1993年通过了NIST的SQL92入门级合规性验证,那时我也是小组中的一个成员。如果一个数据库符合入门级,它的特性集则是Oracle 7.0的一个功能子集。 过渡级 这一级在特性集方面大致介于入门级和中间级之间。 中间级 这一级增加了许多特性,包括 (以下所列并不完整) : 动态SQL 级联DELETE以保证引用完整性 DATE和TIME数据类型 域 变长字符串 CASE表达式 数据类型之间的CAST函数 完备级 增加了以下特性 (同样,这个列表也不完整) : 连接管理 BIT串数据类型 可延迟的完整性约束 FROM子句中的导出表 CHECK子句中的子查询 临时表 入门级标准不包括诸如外联结 (outer join) 、新的内联结 (inner join) 语法等特性。过渡级则指定了外联结语法和内联结语法。中间级增加了更多的特性,当然,完备级就是SQL92全部。有关SQL92的大多数书都没有区别这些级别,这就会带来混淆。这些书只是说明了一个完整实现SQL92的理论数据库会是什么样子。所以无论你拿起哪一本书,都无法将书中所学直接应用到任何SQL92数据库上。关键是,SQL92最多只达到入门级,如果你使用了中间级或更高级里的特性,就存在无法"移植"应用的风险。

2012-07-01 · 1 min · 56 words · -

T-SQL

T-SQL SQL 程式设计语言的增强版,它是用来让应用程式与 SQL Server 沟通的主要语言。T-SQL 提供标准 SQL的DDL 和 DML 功能,加上延伸的函数、系统预存程序以及程式设计结构(例如 IF 和 WHILE)让程式设计更有弹性。 Transact Structured Query Language 它是ANSI和ISO SQL 标准的Microsoft SQL Server方言或扩展,中文理解为: SQL SERVER专用标准结构化查询语言增强版。在 Microsoft SQL Server 7.0 中 T-SQL 有着为数不少的新增功能,包括新的预存程序、系统资料表、函数、资料型别、陈述式以及现存陈述式中的选项。这些都被保留在 SQL Server 2000 中,因此我们在这里要先回顾 (特别是在您还不很熟悉 SQL Server 7.0 中 T-SQL 的功能,这个温习就很重要了)。因为有太多的新功能需要讨论,在此我们仅为每个类别举少数例子来加以介绍。

2012-07-01 · 1 min · 43 words · -

DBCP

DBCP DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包: common-dbcp.jar,common-pool.jar,common-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。 class JdbcUtil { private static BasicDataSource bds; static { if(bds==null) { bds= new BasicDatasource(); } //分别设置数据库的连接参数 bds.setDriverClass bds.url bds.user bds.root } public staitc Connection getConnection() { return bds.getConnection(); } 在spring中配置dbcp: beans.xml: <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <value>classpath:jdbc.properties</value> </property> </bean> <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> jdbc.properties: //放在classpath下 ...

2012-03-27 · 1 min · 76 words · -

JDBC

JDBC JDBC 是阻塞的、同步的 jdbc (java database connection) 就是java数据库链接的api,是java标准类库的扩展,用它可以应用sql访问数据库,完成对数据库的查找,更新。 与其它数据库编程环境相比,jdbc有java语言的特性,使用jdbc开发的程序可以跨平台运行,而且不受数据库供应商的限制。 为什么不受数据库供应商的限制呢? 就在于jdbc的设计。 一、sun公司为sql访问数据库提供一套"纯"java api; 二、同时提供一个驱动管理器,以允许第三方驱动程序可以链接到特定的数据库,这样数据库供应商就可以提供自己的驱动程序,并插入到驱动管理器中,关键是所有的驱动程序都必须满足驱动管理器api提出的要求。 三、需要一套简单的机制,以使得第三方驱动程序可以向驱动管理器注册。 jdbc的典型用法 在传统的客户服务器模式中, 通常在服务器端配置数据库,jdbc驱动程序部署在客户。发展到后来的三层 , 甚至更高层的应用模式时,客户端不直接调用数据库,而是调用服务器上的中间层,再由中间层完成数据库查询操作。这种三层模式的优点是: 它将可视化表示 (位于客户端) 从业务逻辑 (中间件层) 和原始数据 (位于数据库) 中分离出来。因此,我们就可以从不同的客户端,如java应用,applet或web表单,访问相通的数据库和相通的业务规则。 客户端和中间层之间的通信可以通过http (web浏览器用作客户端时) ,rmi (当使用应用或applet) 或其他机制来完成。jdbc负责在中间层和后台数据库之间进行通讯。 JDBC (Java Data Base Connectivity,java数据库连接) 是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序,同时,JDBC也是个商标名。 有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事。换言之,有了JDBC API,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,或为访问Informix数据库又编写另一个程序等等,程序员只需用JDBC API写一个程序就够了,它可向相应数据库发送SQL调用。同时,将Java语言和JDBC结合起来使程序员不必为不同的平台编写不同的应用程序,只须写一遍程序就可以让它在任何平台上运行,这也是Java语言"编写一次,处处运行"的优势。 Java数据库连接体系结构是用于Java应用程序连接数据库的标准方法。JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。作为API,JDBC为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。JDBC使用已有的SQL标准并支持与其它数据库连接标准,如ODBC之间的桥接。JDBC实现了所有这些面向标准的目标并且具有简单、严格类型定义且高性能实现的接口。 Java 具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言。所需要的只是 Java应用程序与各种不同数据库之间进行对话的方法。而 JDBC 正是作为此种用途的机制。 JDBC 扩展了 Java 的功能。例如,用 Java 和 JDBC API 可以发布含有 applet 的网页,而该 applet 使用的信息可能来自远程数据库。企业也可以用 JDBC 通过 Intranet 将所有职员连到一个或多个内部数据库中 (即使这些职员所用的计算机有 Windows、 Macintosh 和UNIX 等各种不同的操作系统) 。随着越来越多的程序员开始使用Java 编程语言,对从 Java 中便捷地访问数据库的要求也在日益增加。 ...

2012-03-27 · 7 min · 1411 words · -

MongoDB

MongoDB # mongodb 5.0以上需要 cpu支持 avx, pve 中 cpu 类型要选 max podman run -d --name wekan-db -p 27017:27017 mongo:5.0.9 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。 模式自由。 支持动态查询。 支持完全索引,包含内部对象。 支持查询。 支持复制和故障恢复。 使用高效的二进制数据存储,包括大型对象 (如视频等) 。 自动处理碎片,以支持云计算层次的扩展性 支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。 文件存储格式为BSON (一种JSON的扩展) 可通过网络访问 所谓"面向集合" (Collenction-Orented) ,意思是数据被分组存储在数据集中,被称为一个集合 (Collenction)。每个 集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库 (RDBMS) 里的表 (table) ,不同的是它不需要定 义任何模式 (schema)。 模式自由 (schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。 存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各中复杂的文件类型。我们称这种存储形式为BSON (Binary Serialized dOcument Format) 。 MongoDB服务端可运行在Linux、Windows或OS X平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB 在32位模式运行时支持的最大文件尺寸为2GB。 MongoDB把数据存储在文件中 (默认路径为: /data/db) ,为提高效率使用内存映射文件进行管理。

2012-02-29 · 1 min · 61 words · -

关系型数据库 VS 非关系型数据库

关系型数据库 VS 非关系型数据库 关系型数据库(Relational database) VS 非关系型数据库 一、关系型数据库? 1.概念 关系型数据库是指采用了关系模型来组织数据的数据库。简单来说,关系模式就是二维表格模型。 主要代表:SQL Server,Oracle,Mysql,PostgreSQL。 2.优点 (1).容易理解,二维表的结构非常贴近现实世界,二维表格,容易理解。 (2)使用方便,通用的sql语句使得操作关系型数据库非常方便。 (3)易于维护,数据库的ACID属性,大大降低了数据冗余和数据不一致的概率。 3.瓶颈 (1 )海量数据的读写效率。 对于网站的并发量高,往往达到每秒上万次的请求,对于传统关系型数据库来说,硬盘I/o是一个很大的挑战。 (2) 高扩展性和可用性。 在基于web的结构中,数据库是最难以横向拓展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库没有办法像web Server那样简单的通过添加更多的硬件和服务节点来拓展性能和负载能力。 传统数据库操作涉及事物机制,每次写入操作需要进行undo、redo操作,然后将redo操作记录到日志文件,有事物开销,不适合写多读少的场景. 二、从关系型到非关系型 关系型数据库的最大优点就是事务的一致性,这个特性,使得关系型数据库中可以适用于一切要求一致性比较高的系统中。比如:银行系统。 但是在网页应用中,对这种一致性的要求不是那么的严格,允许有一定的时间间隔,所以关系型数据库这个特点不是那么的重要了。相反,关系型数据库为了维护一致性所付出的巨大代价就是读写性能比较差。而像微博、facebook这类应用,对于并发读写能力要求极高,关系型数据库已经无法应付。所以必须用一种新的数据结构存储来替代关系型数据库。所以非关系型数据库应用而生。 三、非关系型 1.概念 NoSQL非关系型数据库,主要指那些非关系型的、分布式的,且一般不保证ACID的数据存储系统,主要代表MongoDB,Redis、CouchDB。 NoSQL提出了另一种理念,以键值来存储,且结构不稳定,每一个元组都可以有不一样的字段,这种就不会局限于固定的结构,可以减少一些时间和空间的开销。使用这种方式,为了获取用户的不同信息,不需要像关系型数据库中,需要进行多表查询。仅仅需要根据key来取出对应的value值即可。 2.分类 非关系数据库大部分是开源的,实现比较简单,大都是针对一些特性的应用需求出现的。根据结构化方法和应用场景的不同,分为以下几类。 (1)面向高性能并发读写的key-value数据库 主要特点是具有极高的并发读写性能,例如Redis、Tokyo Cabint等。 (2)面向海量数据访问的面向文档数据库 特点是,可以在海量的数据库快速的查询数据。例如MongoDB以及CouchDB. (3)面向可拓展的分布式数据库 解决的主要问题是传统数据库的扩展性上的缺陷。 3.缺点 但是由于Nosql约束少,所以也不能够像sql那样提供where字段属性的查询。因此适合存储较为简单的数据。有一些不能够持久化数据,所以需要和关系型数据库结合。 四、对比 1.存储上? Sql通常以数据库表的形式存储,例如存储用户信息,SQL中增加外部关系的话,需要在原表中增加一个外键,来关联外部数据表。如下: NoSql采用key-value的形式存储 2.事务? SQL中如果多张表需要同批次被更新,即如果其中一张表跟新失败的话,其他表也不会更新成功。这种场景可以通过事务来控制,可以在所有命令完成之后,再统一提交事务。在Nosql中没有事务这个概念,每一个数据集都是原子级别的。 3.数据表 VS 数据集 关系型是表格型的,存储在数据表的行和列中。彼此关联,容易提取。而非关系型是大块存储在一起。 4.预定义结构 VS 动态结构 在sql中,必须定义好地段和表结构之后,才能够添加数据,例如定义表的主键、索引、外键等。表结构可以在定义之后更新,但是如果有比较大的结构变更,就会变的比较复杂。 在Nosql数据库中,数据可以在任何时候任何地方添加。不需要预先定义。 5.存储规范 VS 存储代码 关系型数据库为了规范性,把数据分配成为最小的逻辑表来存储避免重复,获得精简的空间利用。但是多个表之间的关系限制,多表管理就有点复杂。 当然精简的存储可以节约宝贵的数据存储,但是现在随着社会的发展,磁盘上付出的代价是微不足知道的。 非关系型是平面数据集合中,数据经常可以重复,单个数据库很少被分开,而是存储成为一个整体,这种整块读取数据效率更高。 6.纵向拓展 VS 横向拓展 ...

2012-02-21 · 1 min · 86 words · -

事务隔离

事务隔离 事务隔离级别 标准ANSI SQL规范中定义了四种隔离级别: 未提交读 (Read Uncommitted) : 最低隔离级别,一个事务能读取到别的事务未提交的更新数据,很不安全,可能出现丢失更新、脏读、不可重复读、幻读; 提交读 (Read Committed) : 一个事务能读取到别的事务提交的更新数据,不能看到未提交的更新数据,不可能可能出现丢失更新、脏读,但可能出现不可重复读、幻读; 可重复读 (Repeatable Read) : 保证同一事务中先后执行的多次查询将返回同一结果,不受其他事务影响,不可能出现丢失更新、脏读、不可重复读,但可能出现幻读; 序列化 (Serializable) : 最高隔离级别,不允许事务并发执行,而必须串行化执行,最安全,不可能出现更新、脏读、不可重复读、幻读。 隔离级别越高,数据库事务并发执行性能越差,能处理的操作越少。因此在实际项目开发中为了考虑并发性能一般使用提交读隔离级别,它能避免丢失更新和脏读,尽管不可重复读和幻读不能避免,但可以在可能出现的场合使用悲观锁或乐观锁来解决这些问题。 按照 SQL:1992 事务隔离级别,InnoDB 默认是可重复读的 (REPEATABLE READ) 。MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔离级别。你可以在命令行用-transaction-isolation选项,或在选项文件里,为所有连接设置默认隔离级别。 例如,你可以在my.inf文件的[MySQLd]节里类似如下设置该选项: transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE} 用户可以用 SET TRANSACTION 语句改变单个会话或者所有新进连接的隔离级别。它的语法如下: SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE} 注意: 默认的行为 (不带session和global) 是为下一个 (未开始) 事务设置隔离级别。如果你使用GLOBAL关键字,语句在全局对从那点开始创建的所有新连接 (除了不存在的连接) 设置默认事务级别。你需要SUPER权限来做这个。使用SESSION 关键字为将来在当前连接上执行的事务设置默认事务级别。 任何客户端都能自由改变会话隔离级别 (甚至在事务的中间) ,或者为下一个事务设置隔离级别。 ...

2012-02-08 · 6 min · 1242 words · -

MySQL修改密码

MySQL修改密码 /usr/bin/MySQLadmin -u root password 'haCahpro' MySQL改root密码 MySQL -u root -p MySQL> SET PASSWORD FOR 'root'@'localhost'=PASSWORD('pa55word'); MySQL> QUIT SQL Error (1130): Host '192.168.1.126' is not allowed to connect to this MySQL server 通过HeidiSQL连接MySQL数据库报错: SQL Error (1130): Host ‘192.168.1.126’ is not allowed to connect to this MySQL server 说明所连接的用户帐号没有远程连接的权限,只能在本机(localhost)登录。 需更改 MySQL 数据库里的 user表里的 host项把localhost改称% 首先按下面的步骤登录MySQL服务器 登录MySQL需要切换到dos下的MySQL的bin目录,进行如下操作: MySQL>use MySQL; MySQL>update user set host = '%' where user ='root'; MariaDB [MySQL]> update user set host = ‘%’ where host = ’localhost’; Query OK, 0 rows affected (0.00 sec) Rows matched: 0 Changed: 0 Warnings: 0 ...

2011-12-26 · 1 min · 102 words · -

MySQL 数据类型

MySQL 数据类型 datetime, timestamp 两者都是时间类型字段,格式都一致。两者主要有以下几点区别: 最主要的区别-受时区影响不同。timestamp会跟随设置的时区变化而变化,而datetime保存的是绝对值不会变化。 详细可以阅读这篇博客的演示: MySQL: Datetime Versus Timestamp Data Types 一个timestamp字段,一个datetime字段,修改时区SET TIME_ZONE = “america/new_york”;后,timestamp字段的值变了! 因此,如果应用场景有跨时区要求的要特别注意这点。 占用存储空间不同。timestamp储存占用4个字节,datetime储存占用8个字节: 12.8 Data Type Storage Requirements 可表示的时间范围不同。timestamp可表示范围:1970-01-01 00:00:00~2038-01-09 03:14:07,datetime支持的范围更宽1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 索引速度不同。timestamp更轻量,索引相对datetime更快。 数值类型 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分或者用零填补。 各种数值类型以及它们的允许范围和占用的内存空间。 TINYINT 大小: 1 字节 范围 (有符号) : -128 ~ 127 范围 (无符号) : 0 ~ 255 用途: 小整数值 SMALLINT 大小: 2 字节 范围 (有符号) : -32,768 ~ 32,767 范围 (无符号) : 0 ~ 65,535 用途: 大整数值 MEDIUMINT 大小: 3 字节 范围 (有符号) : -8,388,608,8,388,607 范围 (无符号) : 0,16,777,215 用途: 大整数值 INT 或 INTEGER 大小: 4 字节 范围 (有符号) : -2 147 483 648,2 147 483 647 范围 (无符号) : 0,4 294 967 295 用途: 大整数值 类型 - 大小 范围 (有符号) 范围 (无符号) 用途 BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) FLOAT 4 字节 (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度浮点数值 DOUBLE 8 字节 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度浮点数值 DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值小数值 ...

2011-12-26 · 4 min · 726 words · -

MySQL用户与权限管理

MySQL用户与权限管理 //创建新用户 user0 cREATE USER user0 IDENTIFIED BY 'password0';``` \***密码要带引号 授权: ```bash grant all privileges on database0.* to user0@localhost identified by 'password0'; 授权之后该用户才能用他自己的用户名密码访问MySQL. 从MySQL删除用户账户 要想移除账户,应使用Drop USER语句. Drop USER user [, user] … Drop USER语句用于删除一个或多个MySQL账户。要使用Drop USER,您必须拥有MySQL数据库的全局Create USER权限或Delete权限。使用与GRANT或REVOKE相同的格式为每个 账户命名;例如,‘jeffrey’@’localhost’。 账户名称的用户和主机部分与用户表记录的User和Host列值相对应。 www.87717.com 使用Drop USER,您可以取消一个账户和其权限,操作如下: Drop USER user; 该语句可以删除来自所有授权表的帐户权限记录。 drop user [username@’%’][1] drop user username@localhost 改密码: grant all privileges on DBNAME.* to user0@localhost identified by ‘password4’; ###’@localhost’ 这个一定要有….. 为root加上密码xxx123: ./bin/MySQLadmin -u root password xxx123 或写成 ...

2011-12-26 · 3 min · 500 words · -