SQL Server2008 事务和锁详解
(MSSQL个人笔记之数据库优化之路五)
1.SQL Server2008 事务和锁详解(MSSQL个人笔记之数据库优化之路五)
2.
3./********************************************************************************
4. *主题:SQL Server2008 事务和锁详解
5. *说明:本文是个人学习的一些笔记和个人愚见
6. * 有很多地方你可能觉得有异议,欢迎一起讨论
7. *文章出处:https://www.doczj.com/doc/9413069554.html,/szstephenzhou/article/details/7814433
8. * 博客地址:https://www.doczj.com/doc/9413069554.html,/szstephenzhou
9. *作者:Stephenzhou(阿蒙)
10. *日期: 2012.07.31
11. *Mail:szstephenzhou@https://www.doczj.com/doc/9413069554.html,
12. *另外:转载请著名出处。
13.**********************************************************************************/
今天主要讲下锁,但是说到锁肯定就是要说到事务。
说到事务就要说下它的三个特性:自动性,一致性,独立性,持久性。
事务的分类:自动提交事务,显式事务,隐式事务,批处理级事务。
在这里不做过多的介绍和说明,如有疑问可以留言。。
[sql]view plaincopyprint?
1. --事务个数的查询
2. select @@TRANCOUNT
3.
4. /*
5.-----------
6.0
7.
8.(1 行受影响)*/
9.
10.--save transaction 设置保存点
11.
12.
13.
https://www.doczj.com/doc/9413069554.html,e Erp_System
16.begin transaction InsertTransl
17.save transaction A
18.delete consume_Shopid_Range where
19. id='10010xxxxxxx1'
20.and Shopid=2
21.and GoodsId=6
22.and Amount =894
23.and ConsumeDate='2012-07-26 11:55:40.153'
24.and mark='2FA4E2F3-DD8B-4ED3-8D9C-D7AE33BA5D0D'
25. rollback transaction A
26. insert into consume_Shopid_Range
27. (id,Shopid,GoodsId,Amount,ConsumeDate,mark)values
28. ('10010xxxxxxx2',3,1,321,'2012-07-31 11:55:40.153','szstephenzhou')
29. commit transaction InsertTransl
30. go
31.
32./*(0 行受影响)
33.
34.(1 行受影响)*/
35.--分析下上个结果:
36.--在上面的一个事务中,所限开始了一个事务 InsertTransl
37.--在这个事务中设置了保存的A
38.--然后删除一条记录
39.--回顾到A点也就是没有删除
40.--新增了一条记录
41.--commit提交事务InsertTransl
42.
43.
44.
45.
46.---Set xact_abort 语句
47./*
48. *格式如下:
49. *SET XACT_ABORT {ON|OFF}
50. *当设置为 setxact_abort on 时,如果SQL语句出现运行错误,则数据库引擎将终止并回滚整个事务,
51.即使前面能够正确的执行的SQL。
52. *当设置成set xact_abort off 如果SQL错误的时候,数据库只回滚产生错误的sql语句。并且事务继续
53.默认的情况是ON
55.if OBJECT_ID('tb') is not null
56.drop table tb
57.go
58.create table tb(id int identity primary key ,name varchar(10))
59.
60.
61. set xact_abort on
62. begin transaction insetran
63. insert into tb values('stephen');
64. insert into tb values('mrzhou');
65. insert into tb values('stephen----------');
66. insert into tb values('刘德华');
67. insert into tb values('张学友');
68. commit transaction insetran
69. go
70. /*
71.消息 208,级别 16,状态 1,第 3 行
72.对象名 'tb' 无效。
73.
74. */
75. select * from tb
76. /*
77. id name
78.----------- ----------
79.
80.(0 行受影响)
81.
82. */
83. set xact_abort off
84. begin transaction insetran
85. insert into tb values('stephen');
86. insert into tb values('mrzhou');
87. insert into tb values('stephen----------');
88. insert into tb values('刘德华');
89. insert into tb values('张学友');
90. commit transaction insetran
91. go
92. /*
93.(1 行受影响)
94.
95.(1 行受影响)
96.消息 8152,级别 16,状态 14,第 4 行
97.将截断字符串或二进制数据。
98.语句已终止。
99.
100.(1 行受影响)
101.
102.(1 行受影响)
103.*/
104.
105.s elect * from tb
106./*id name
107.----------- ----------
108.1 stephen
109.2 mrzhou
110.4刘德华
111.5张学友
112.
113.(4 行受影响)
114.*/
115.
116.--如上所述当set xact_abort on 如果出现错误就会全部回滚而设置成off的时候就只跳过错误继续执行。。117.
118.--但是如果设置成off的时候也是没办法执行跳过。这是为什么呢??
119.
120.set xact_abort off
121.begin transaction insetran
122.insert into tb values('stephen');
123.insert into tb values('mrzhou');
124.insert into tb values(1,'stephen');
125.insert into tb values('刘德华');
126.insert into tb values('张学友');
https://www.doczj.com/doc/9413069554.html,mit transaction insetran
128.go
129.
130./*
131.消息 8101,级别 16,状态 1,第 5 行
132.仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'tb'中的标识列指定显式值。
133.*/
134.--因为在这里是属于编译错误,在identity属性中不能插入数字。
135.
136.
137.
138.
139.
140.
141.--在事务中有些语句是不能用的如下
142./*
143. *CREATE DATABASE
144. *ALTER DATABASE
145. *DROP DATABASE
146. *RECONFIGURE
147. *BACKUP
148. *RESTORE
149. *UPDATE STATISTICS
150.
151.*/
锁机制
什么是锁,锁到底是个什么东西?有很多人都感觉是懂非懂的样子,了解了,好像是个什么东西。其实很简单什么到底是什么呢?锁是一种规则。是用来控制同步
数据访问控制的一种机制。
打个比方吧,数据库中的锁就像交通信号灯。而车子就是每个事务。如果没有好好的控制红绿灯的话就会怎么样,当然是堵车了。如果没有控制好锁同样会堵塞。
锁的定制
大家都知道,数据库的资源只由一个用户使用只要程序没问题,数据就不会出现不一致的情况。如果两个或者多个用户同时修改就有可能出现并发冲突导致如下错误:
更新丢失
更新丢失是指两个用户同时更新一个数据库对象,其中一个用户更新覆盖了之前那个用户的更新从而导致错误
不可重复读
一个用户在一个事务中读取的数据前后不一致,其中可能是有别的用户做了修改
幻读
一个用户读取一个结果集后,其他用户对该结果集进行了插入或者删除,当第一个用户再读这个结果集的时候发现数据多了或者少了。
为了解决这些问题,SQLserver 数据库引入了锁。
1》从数据库系统的角度分为共享锁S 排它锁X(独占锁)更新锁U 意向锁架构锁和大容量更新锁等
共享锁S:
并发执行对一个数据资源读取操作时,任何其他事务不能修改该资源的数据;读取操作完成后S锁释放。
排它锁X:
在执行INSERT ,UPDATE,DELETE时,确保不会同时对同一资源进行多重更新操作。修改数据之前,需要执行读取操作获取数据此时需要申请共享锁S,然后再申请排它锁X
更新锁U:
为了避免死锁的情况而使用的锁模式
两个事务对一个数据资源先读取再更新的操作,使用了S锁和X锁进行操作。X锁一次只有一个X锁在对象上的,也就是说一次只有一个事务可以获取资源的更新锁。如果需要对数据进行修改操作,则需要把更新锁转换为U锁,否则将锁转换成S 锁
意向锁I:
需要在层次结构中的某些底层资源上获取S锁或者X锁或者U锁。意向锁可以提高性能,因为数据库引擎不需要检查表中的每行或每页上的S锁就确定是否可以获取到该表上的X锁。
架构锁:
为了防止修改表结构时对表进行的并发访问锁。
大容量更新锁
允许多个线程将数据并发地大容量加载到同一个表中,同时禁止其他与大容量插入数据无关的进程访问该表
2》从并发的手段分为乐观并发和悲观并发
乐观并发:
意向排他锁(IX 锁)与IX 锁模式兼容,因为IX 表示打算只更新部分行而不是所有行。还允许其他事务尝试读取或更新部分行,
只要这些行不是其他事务当前更新的行即可。此外,如果两个事务尝试更新同一行,则将在表级和页级上授予这两个事务IX 锁。
但是,将在行级授予一个事务X 锁。另一个事务必须在行级锁被删除前等待。
锁的粒度
锁粒度指SQL Server锁定数据资源的类型。锁定的粒度越小,数据库的并发就越高。因为锁定越小的数据库资源,不会影响其他用户使用其他资源。
SQL SERVER 支持的粒度包括:
行RID 键key 页page 区间extent 堆hobt 表table 文件file 应用程序application 元数据metadata 分配单元application_unit 数据库database
当然在实际使用过程中不需要考虑粒度。sqlserver数据库引擎采用动态锁策略。
如果一个事务在一个表中很多行放了意向锁,则数据库引擎可以为其分配一个表级锁,然后释放所有低级别的行级锁,从而减少管理锁的开销。
跟踪锁的活动情况
在用户看来锁是透明的,因为SQL Server数据库引擎会根据具体情况决定是否用锁,以及使用任何类型的锁。虽然感觉不到锁的存在,但是锁的使用情况直接关系到数据库引擎工作发生的。
1>使用SQL Server事件探测器跟踪数据库的工作情况,监视锁的活动情况。
新建跟踪,在跟踪属性对话框单击事件选择展开Locks事件类如图:
解释下上面的一些锁事件:
Deadlock Graph :用于提供死锁的xml说明
Lock:Acquired 表示已经获取资源如表的一行的锁
Lock :Cancel 跟踪在获取锁之前取消的锁请求
Lock Deadlock Chain 监视死锁条件的发生事件和涉及的对象
Lock :Deadlock 跟踪死锁的时间,通常犹豫某事件申请被其他事务锁定的资源时发生死锁。
Lock:Escalation 用于指示粒度较小转换成粒度较大的锁。
Lock:Released 跟踪释放事件
Lock:Timeout 跟踪锁超时的情况。由于一个事务持有申请资源的阻塞锁,导致另一个事务规定时间内无法完成锁的请求,从而超时。
2>利用系统监视器监视SQL Server锁的活动情况。
前面已经介绍了相关操作这里不做过多的介绍只说下主要关于锁的介绍
管理工具性能添加打开如下:
Average Wait Time :获取锁而等待的平均时间
Lock Requests :锁管理每秒请求的新锁和锁转换数量
Lock Timeout(TIMEOUT>0) 每秒超时的锁请求数量不包括timeout=0
。。。。。
设置事务隔离级别选项
READ UNCOMMITTED 指定语句可以读取已由其他事务修改但是没有提交的行。这种读取叫脏读。
READ COMMITTED 不能读取其他事务正在修改但是没有提交的事务。默认
REPEATABLE READ 不能读取其他事务正在修改但没有提交的行而且其他事务也不能修改当前事务也不能修改在提交前所读取的数据。
SNAPSHOT 指定事务在开始时,就获取了已经提交的快照。因此当前事务只能看到事务开始之前对数据所做的修改。SERIALIZABLE 最高级别事务隔离。一个查询智能看到事务开始之前提交的数据,无法看到脏数据或事务执行中其他并夯实无锁修改的数据。在这个级别下事务好像一个个被串起来执行。也就没有并发这一说了。
格式:
SET TRANSACTION ISOLATION LEVEL
{READ UNCOMMITTED
|READ COMMITTED
|REPEATABLE READ
|SNAPSHOT
|SERIALIZABLE
}
接下来上实例:
[sql]view plaincopyprint?
1.
2. select * from consume_Shopid_Range
3.where
4. id='10010xxxxxxx2' and Shopid=3and GoodsId=1 and Amount=321 and ConsumeDate='2012-07-31 11:55:40.153'
and mark='szstephenzhou'
5.
6. /*
7. id Shopid GoodsId Amount Cons
umeDate mark
8.-------------------------------------------------- ----------- ----------- ---------------------- -----
------------------ ------------------------------------------------------------------------------------
----------------
9.10010xxxxxxx2 3 1 321 2012-
07-31 11:55:40.153 szstephenzhou
10.
11.(1 行受影响)
12.
13. */
14.
15. use Erp_System
16.go
17.begin tran
18.update consume_Shopid_Range set mark='https://www.doczj.com/doc/9413069554.html,/szstephenzhou'
19.where
20. id='10010xxxxxxx2' and Shopid=3and GoodsId=1 and Amount=321 and ConsumeDate='2012-07-31 11:55:40.153'
and mark='szstephenzhou'
21.waitfor delay '00:00:10'
22.rollback tran
23.
24.
25.--然后在另外一个新建查询执行
https://www.doczj.com/doc/9413069554.html,e Erp_System
27.go
28.set transaction ISOLATION level READ UNCOMMITTED
29.
30.select * from consume_Shopid_Range
31.where
32. id='10010xxxxxxx2' and Shopid=3and GoodsId=1 and Amount=321 and ConsumeDate='2012-07-31 11:55:40.153'
and mark='szstephenzhou'
33. WAITFOR DELAY '00:00:10'
34.
35. select * from consume_Shopid_Range
36.where
37. id='10010xxxxxxx2' and Shopid=3and GoodsId=1 and Amount=321 and ConsumeDate='2012-07-31 11:55:40.153'
and mark='szstephenzhou'
38.
39. /*
40.
41. id Shopid GoodsId Amount Cons
umeDate mark
42.-------------------------------------------------- ----------- ----------- ---------------------- -----
------------------ ------------------------------------------------------------------------------------
----------------
43.
44.(0 行受影响)
45.
46.id Shopid GoodsId Amount Consu
meDate mark
47.-------------------------------------------------- ----------- ----------- ---------------------- -----
------------------ ------------------------------------------------------------------------------------
----------------
48.10010xxxxxxx2 3 1 321 2012-
07-31 11:55:40.153 szstephenzhou
49.
50.(1 行受影响)
51. */
52.
53.
解释:
在第二个查询查看分别相隔10秒查询的结果不一样。原因就是在查询这条记录的时候,设置了事务隔离级别为uncommitted,这时候读出来的是脏数据。因为第一个事务在执行修改了,但是没有提交而事务二读出来所以是空的。等第一个事务回
滚第二个事务再次读取的时候还是原来的事务了
说的有点含糊换个例子来说明可能看的更仔细了看下面的
[sql]view plaincopyprint?
https://www.doczj.com/doc/9413069554.html,e Erp_System
2.go
3.select * from tb
4./*
5.id name
6.----------- --------------------
7. 1 刘德华
8. 2 mrzhou
9. 3 mrjun
10. 4 俊俊
11. 5 慧慧
12.
13.(5 行受影响)
14.
15.*/
16.
17.
18.-----------------------------------------------------------------------------------------------
19.-------------------------1.read uncommitted 脏读数据-------------------------------------------
20.-----------------------------------------------------------------------------------------------
21.
22.
23.--打开一个窗口输入这个事务
https://www.doczj.com/doc/9413069554.html,e Erp_System
25.go
26.begin tran
27.update tb set name='张学友' where id=1
28.waitfor delay '00:00:10'
29.rollback tran
30.go
31.
32.--再打开一个窗口输入查询事务设置事件隔离级别为uncommitted 产生了脏读。在第一个事务更新没有提交的数据第二个事务
也读到了
https://www.doczj.com/doc/9413069554.html,e Erp_System
34.go
35.set transaction isolation level read uncommitted
36.select * from tb
37.waitfor delay '00:00:10'
38.select * from tb
39.
40.--输出结果为
41./*
42.id name
43.----------- --------------------
44. 1 张学友
45. 2 mrzhou
46. 3 mrjun
47. 4 俊俊
48. 5 慧慧
49.
50.(5 行受影响)
51.
52.id name
53.----------- --------------------
54. 1 刘德华
55. 2 mrzhou
56. 3 mrjun
57. 4 俊俊
58. 5 慧慧
59.
60.(5 行受影响)
61.*/
62.
63.
64.-----------------------------------------------------------------------------------------------
65.-------------------------1.read committed -------------------------------------------
66.-----------------------------------------------------------------------------------------------
67.
68.
69.-- 打开一个窗口输入查询事务设置事件隔离级别为read committed
https://www.doczj.com/doc/9413069554.html,e Erp_System
71.go
72.set transaction isolation level read committed
73.begin tran
74.select * from tb
75.waitfor delay '00:00:10'
76.select * from tb
77.rollback tran
78.
79.--再打开一个窗口输入
80. use Erp_System
81. go
82. update tb set name='我是大傻瓜' where id=1
83.
84. ---再查看第一个窗口的结果如下:
85. /*
86. id name
87.----------- --------------------
88. 1 刘德华
89. 2 mrzhou
90. 3 mrjun
91. 4 俊俊
92. 5 慧慧
93.
94.(5 行受影响)
95.
96.id name
97.----------- --------------------
98. 1 我是大傻瓜
99. 2 mrzhou
100.3 mrjun
101.4俊俊
102.5慧慧
103.
104.(5 行受影响)
105.
106.*/
107.
108.
109.--分析
110.--在第一个查询事务前后相隔十秒查询的结果不一致,事务隔离级别为read committed 原因是在查询的时候有事务修改了这个
111.--数据。必须使用repeatable read级别才能隔离
112.
113.
114.
115.----------------------------------------------------------------------------------------------- 116.-------------------2.repeatable read 事务级别在未回滚提交别的事务是不可以更改一直处于等待------------- 117.----------------------------------------------------------------------------------------------- 118.---打开一个窗口输入查询事务
https://www.doczj.com/doc/9413069554.html,e Erp_System
120.g o
121.s et transaction isolation level repeatable read
122.b egin tran
123.s elect * from tb
124.w aitfor delay '00:00:10'
125.s elect * from tb
126.r ollback tran
127.
128.
129.--再打开一个窗口输入
https://www.doczj.com/doc/9413069554.html,e Erp_System
131.go
132.update tb set name='我是刘德华' where id=1
133.
134.--查看结果
135./*
136.id name
137.----------- --------------------
138.1我是大傻瓜
139.2 mrzhou
140.3 mrjun
141.4俊俊
142.5慧慧
143.
144.(5 行受影响)
145.
146.i d name
147.----------- --------------------
148.1我是大傻瓜
149.2 mrzhou
150.3 mrjun
151.4俊俊
152.5慧慧
153.
154.(5 行受影响)
155.
156.*/
157.
158.
159. ----------------------------------------------------------------------------------------------- 160.-------------------2.SNAPSHOT事务隔离级别,----------------------------------------------------- 161.--------------SNAPSHOT级别无视数据的更新,数据在这个事务的读取都是读取之前快照上的数据----------- 162.
163.--如果把以上的update改成insert 在事务一查询出来两个结果还是不同。如下实例
164.
165.--在窗口中执行
166.
167.u se Erp_System
168.g o
169.s et transaction isolation level repeatable read
170.b egin tran
171.s elect * from tb
172.w aitfor delay '00:00:10'
173.s elect * from tb
174.r ollback tran
175.
176.--再打开窗口执行
https://www.doczj.com/doc/9413069554.html,e Erp_System
178.go
179.insert into tb values('SNAPSHOT')
180.
181.--结果如下:
182./*
183.i d name
184.----------- --------------------
185.1我是刘德华
186.2 mrzhou
187.3 mrjun
188.4俊俊
189.5慧慧
190.
191.(5 行受影响)
192.
193.i d name
194.----------- --------------------
195.1我是刘德华
196.2 mrzhou
197.3 mrjun
198.4俊俊
199.5慧慧
200.6 SNAPSHOT
201.
202.(6 行受影响)
203.
204.*/
205.--需要把事务级别提高到SNAPSHOT
206.s et transaction isolation level SNAPSHOT
207./*
208.提示错误如下:
209.i d name
210.----------- --------------------
211.消息 3952,级别 16,状态 1,第 3 行
212.快照隔离事务访问数据库 'Erp_System' 失败,因为在此数据库中不允许快照隔离。请使用 ALTER DATABASE 以允许快照隔离。
213.*/
214.
215.--需要更改
216.s elect snapshot_isolation_state_desc from sys.databases where name='Erp_System'
217.
218./*
219.s napshot_isolation_state_desc
220.------------------------------------------------------------
221.O FF
222.
223.(1 行受影响)
225.*/
226.
227.a lter database Erp_System set allow_snapshot_isolation on
228.
229.--命令已成功完成。
230.s elect snapshot_isolation_state_desc from sys.databases where name='Erp_System' 231.
232./*
233.s napshot_isolation_state_desc
234.------------------------------------------------------------
235.O N
236.
237.(1 行受影响)
238.*/
239.
240.u se Erp_System
241.g o
242.s et transaction isolation level snapshot
243.b egin tran
244.s elect * from tb
245.w aitfor delay '00:00:10'
246.s elect * from tb
247.r ollback tran
248.
249.--再打开窗口执行
https://www.doczj.com/doc/9413069554.html,e Erp_System
251.go
252.insert into tb values('SNAPSHOT')
253./*
254.执行结果;
255.id name
256.----------- --------------------
257.1我是刘德华
258.2 mrzhou
259.3 mrjun
260.4俊俊
261.5慧慧
262.
264.(5 行受影响)
265.
266.i d name
267.----------- --------------------
268.1我是刘德华
269.2 mrzhou
270.3 mrjun
271.4俊俊
272.5慧慧
273.
274.
275.(5 行受影响)
276.
277.*/
278.
279.
280. -----------------------------------------------------------------------------------------------
281.-------------------5.SERIALIZABLE事务隔离级别,----------------------------------------------------- 282.--------------SEIALIZABLE 不做过多的说明,最高级别把所有事务作为一个串行执行没有并发的效果----------
全面解释死锁
先上例子然后再来分析下这个代码
[sql]view plaincopyprint?
1.--两个表的如下
2.select * from tb
3./*
4.id name
5.----------- --------------------------------------------------
6. 1 我是刘德华
7. 2 mrzhou
8. 3 mrjun
9. 4 俊俊
10. 5 慧慧
11.8 SNAPSHOT
12.
13.(6 行受影响)
14.*/
15.select * from ta
16./*
17.id name
18.----------- --------------------------------------------------
19. 1 mrzhou
20. 2 stephenzhou
21. 3 Hello
22.
23.(3 行受影响)
24.
25.
26.*/
27.
28.--新建查询输入执行
https://www.doczj.com/doc/9413069554.html,e Erp_System
30.go
31.set transaction isolation level SNAPSHOT
32.begin tran
33.update ta set name='https://www.doczj.com/doc/9413069554.html,/szstephenzhou' where id=2
34.waitfor delay '00:00:10'
35.update tb set name='https://www.doczj.com/doc/9413069554.html,/szstephenzhou' where id=8
https://www.doczj.com/doc/9413069554.html,mit tran
37.
38. --然后再新建查询窗口执行注意相隔不要超过十秒
39. use Erp_System
40.go
41.set transaction isolation level SNAPSHOT
42.begin tran
43.update ta set name='https://www.doczj.com/doc/9413069554.html,/szstephenzhou' where id=2
44.waitfor delay '00:00:10'
45.update tb set name='https://www.doczj.com/doc/9413069554.html,/szstephenzhou' where id=8
https://www.doczj.com/doc/9413069554.html,mit tran
SQLServer(多语句表值函数代码) 代码如下: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go CREATE FUNCTION [dbo].[ufnGetContactInformation](@ContactID int) RETURNS @retContactInformation TABLE ( -- Columns returned by the function [ContactID] int PRIMARY KEY NOT NULL, [FirstName] [nvarchar](50) NULL, [LastName] [nvarchar](50) NULL, [JobTitle] [nvarchar](50) NULL, [ContactType] [nvarchar](50) NULL ) AS -- Returns the first name, last name, job title and contact type for the specified contact. BEGIN
DECLARE @FirstName [nvarchar](50), @LastName [nvarchar](50), @JobTitle [nvarchar](50), @ContactType [nvarchar](50); -- Get common contact information SELECT @ContactID = ContactID, @FirstName = FirstName, @LastName = LastName FROM [Person].[Contact] WHERE [ContactID] = @ContactID; SET @JobTitle = CASE -- Check for employee WHEN EXISTS(SELECT * FROM [HumanResources].[Employee] e WHERE e.[ContactID] = @ContactID) THEN (SELECT [Title] FROM [HumanResources].[Employee] WHERE [ContactID] = @ContactID) -- Check for vendor
SQLSERVER数据库操作 ******操作前,请确定SQL的服务已经开启******** 一:登录进入sql数据库 1、开始---所有程序---Microsoft SQL Server 2005---SQL Server Management Studio Express 2、此时出现“连接到服务器”的对话框, “服务器名称”设置为SQL数据库所在机器的IP地址 “身份验证”设置为SQL Server身份验证或者Windows 身份验证 填写登录名和密码后,点击“连接”按钮,即可进入到SQL数据库操作界面。 二:新建数据库 登录进去后,右击“数据库”,选择—“新建数据库” 设置数据库名称,在下面的选项卡中还可以设置数据库的初始大小,自动增长,路径。 点击确定,一个数据库就建好了。 三:如何备份的数据库文件。 登录进入后,右击相应的需要备份数据库----选择“任务” 目标下的备份到,点击“添加”按钮可以设置备份数据库保存的路径。 四:如何还原备份的数据库文件。(以本地机器为例子) 1、设置服务器名称,点击右边的下拉框的三角,选择“浏览更多…”。 此时出现查找服务器对话框,选择“本地服务器”---点开“数据库引擎”前面 的三角---选中出现的服务器名称—确定。 (注:可以在“网络服务器”选项卡中设置网络服务器) 2、设置身份验证,选择为“windows身份验证” 3、点击连接按钮,进入数据库管理页面 4、右击“数据库”,选择“还原数据库”,出现还原数据库的对话框 还原的目标----目标数据库,这里设置数据库的名字 还原的源----选择“源设备”,在弹出的对话框中点击“添加”按钮,找到所备 份的数据库文件,确定。 5、此时,在还原数据库对话框中会出现所还原的数据库的信息。在前面选中所需还 原的数据库。确定。 6、为刚刚还原的数据库设置相应的用户。 a点开“安全性”---右击“登录名”---新建登录名 b 设置登录名(假如为admin),并设置为SQL Server身份验证,输入密码,去除 “强制实施密码策略”前的勾。 C 找到导入的数据库,右击此数据库----选择“属性”,在选择页中,点击“文件” 设置所有者,点击右边的按钮,选择“浏览”,找到相应的用户(如admin)。确 定。。 7、此时重新以admin的身份进入,就可操作相应的数据库。
sql server日期时间函数 Sql Server中的日期与时间函数 1. 当前系统日期、时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值 例如:向日期加上2天 select dateadd(day,2,'2004-10-15') --返回:2004-10-17 00:00:00.000 3. datediff 返回跨两个指定日期的日期和时间边界数。 select datediff(day,'2004-09-01','2004-09-18') --返回:17 4. datepart 返回代表指定日期的指定日期部分的整数。 SELECT DATEPART(month, '2004-10-15') --返回 10 5. datename 返回代表指定日期的指定日期部分的字符串 SELECT datename(weekday, '2004-10-15') --返回:星期五 6. day(), month(),year() --可以与datepart对照一下 select 当前日期=convert(varchar(10),getdate(),120) ,当前时间=convert(varchar(8),getdate(),114) select datename(dw,'2004-10-15') select 本年第多少周=datename(week,'2004-10-15') ,今天是周几=datename(weekday,'2004-10-15') 函数参数/功能 GetDate( ) 返回系统目前的日期与时间 DateDiff (interval,date1,date2) 以interval 指定的方式,返回date2 与date1两个日期之间的差值 date2-date1 DateAdd (interval,number,date) 以interval指定的方式,加上number之后的日期 DatePart (interval,date) 返回日期date中,interval指定部分所对应的整数值
1、事务的概念: 事务是一个基本的逻辑单元,它作为一个整体要么全部执行要么全部不执行。 2、事务的特性: 原子性:事务是处理的一个原子单位,每一个操作不可拆分,它要么全部执行成功,要么全部都不执行。 一致性:指事务完成时,必须使所有的数据在整体上不变。 隔离性:各事务之间相互隔离,此事务的执行不受其他并发事务执行的干扰。 持续性:指事务对数据库的改变应是持续存在的,不会因故障而发生丢失。 3、从功能是上划分,sql语言分为DDL、DML和DCL: 3.1DDL(Data Definition Language,数据定义语言): 用于定义和管理数据库中的所有对象的语言,如:create创建表空间、alter修改表空间、drop 删除表空间 3.2:DML(Data manipulation Language,数据操作语言): 处理数据等操作,如:insert插入数据、delete删除数据、update修改数据、select查询数据3.3:DCL(Data Control Language,数据控制语言): 授予或回收访问数据库的权限,控制数据库操作事务发生的时间及效果,对数据库实行监视,如:grant授权,rollback回滚,commit提交 4、事务的开始及结束: 一个事务可以由一条DDL语句单独组成或多条DML语句共同组成。一个事务从执行第一条sql语句开始,在它被提交或被回滚时结束。事务的提交可以是显式提交:用commit命令直接完成;也可以是提交隐式提交:用sql语句间接完成提交,这些语句有:alter,audit,comment,create,disconnect,drop,exit,grant,noaudit,quit,revoke,rename,会话终止等;还可以是自动提交:set autocommit on或set autocommit immediate设置为自动提交,则在插入、删除、修改语句执行后自动提交,使用set autocommit off可以取消自动提交,show autocommit可以查看自动提交是否打开。事务的回滚使用rollback;语句,可以为事务设置保存点,如:savepoint point1,然后使用rollback to [savepoint] point1回到保存点point1,若在point1后又设置了一个保存点savepoint point2,则在rollback to point1后将不能再回滚到point2,因为point2在point1的后面,point1的保存点不存在point2。 5、事务的并发性与一致性: 并发性:多个用户可以在同一时刻访问相同的数据。 一致性:保证并发性的同时,每个用户能得到一致的数据视图。 并发执行事务时,可能发生如下情况: ①脏读:某个事务读取了其他未提交事务修改过的数据。 脏读示例:提交读隔离级别可防止脏读,但不能防止不可重复读 ②不可重复读:某个事务读取一次数据后,其他事务修改了这些数据并进行了提交,这样当该事务重新读取这些数据时,就会得到与前一次读取不一致的结果。简单的说,就是同样的条件,你读取过的数据,再次读取时发现值不一样了。 不可重复读示例:可重复读隔离级别可防止脏读和不可重复读
文章编号:1000-2375(2005)01-0019-05 事务并发控制中的两段锁和 可串行化冲突图的对比 金 蓉,李跃新 (湖北大学数学与计算机科学学院,湖北武汉430062) 摘 要:数据库中并发操作一般分为数据级和事务级两种,由于资源的竞争可能引起数据级的冲突和事 务级的冲突,因此需要对并发执行的事务转化为某个可串行化调度,从而确保数据库的一致性.目前并发控制的方法有很多,从锁和非锁机制两个方面分析了两段锁和可串行化冲突图两种并发控制的规则和数据结构及分类,并从事务的冲突可串行化方面和结构上分析了各自的性能和优缺点. 关键词:锁;两段锁协议;可串行化冲突图 中图分类号:TP311 文献标志码:A 收稿日期:2004-03-25 作者简介:金 蓉(1979- ),女,硕士生1 引 言 数据库中的并发操作一般分为数据级和事务级两种,一方面在微观数据级上有数据对象的读(Read )操作和写(Write )操作,另一方面在宏观事务级上有事务的操作原语:终止(Abort ),开始(Begin ),提交(C ommit ),结束(End ),实质上事务中包含着对一系列数据对象的操作,因为一个事务系统主要由3个部分构成:数据项集、对数据项集的操作和控制事务存取数据的管理器(我们称为事务管理器T M ).并发控制的作用是正确协调同一时间里多个事务对数据库的并发操作,解决资源竞争问题以保证数据库的一致性和完整性. 并发控制是通过调度来确保事务的并发执行的效果等同于没有并发执行时的执行效果,也就是使事务的并发执行调度等价于事务的某个可串行化调度,从而确保数据库的一致性.可串行化简单的说就是一个并发操作等效于某个串行执行的效果,也即有相同的输出结果,与串行操作对数据库有同样的效果. 冲突有数据级的冲突和事务级的冲突,数据间的冲突体现在数据库中同时对相同的数据对象操作,事务间的冲突是由事务的数据相关性及在共享数据对象上的交互作用而引起的,通常用事务的“冲突关系”来表示. 定义1 数据对象d 上的两个操作p 、q 是“冲突”的,记为CT (d ,p ,q ),当且仅当S (S (s ,p ),q )≠S (S (s ,q ),p )∨R (s ,p )≠R (S (s ,q ),p )∨R (s ,q )≠R (S (s ,p ),q ).其中,S (s ,p )和R (s ,p )分别表示操作p 对d 的给定状态s 所产生的结果状态和结果输出(返回). 由定义可知,两个或多个数据操作产生冲突的条件是1)它们属于不同的事务;2)都访问数据库中相同的数据对象;3)并且至少有一个是写操作否则就不会产生冲突. 定义2 两个事务t 1、t 2是“冲突”的,记为t 1CR t 2,是指它们包含了(至少)一对冲突操作.即对于任何t 1≠t 2,t 1CR t 2,当且仅当?d 、?p ,q (p (d )∈t 1∧q (d )∈t 2∧CT (d ,p ,q ). 事务间的冲突归根结底集中在数据操作的冲突上,因此解决冲突最初的方法是对数据对象采用锁机制,而锁可以分为读锁和写锁,当数据对象加了读锁后可以再加读锁但不能加写锁,因此读锁是共享的,当数据对象加了写锁后就不能加其他任何锁,因此写锁是排它的,显然读锁较写锁的并发度高. 第27卷第1期2005年3月湖北大学学报(自然科学版)Journal of Hubei University (Natural Science ) V ol.27 N o.1 Mar.,2005
Sql Server 常用函数 1,统计函数avg, count, max, min, sum 2, 3,多数聚会不统计值为null的行。可以与distinct一起使用去掉重复的行。可以与group by 来分组4, 5, 2,数学函数 6, 7, SQRT 8, ceiling(n) 返回大于或者等于n的最小整数 9, floor(n), 返回小于或者是等于n的最大整数 10,round(m,n), 四舍五入,n是保留小数的位数 11,abs(n) 12,sign(n), 当n>0, 返回1,n=0,返回0,n<0, 返回-1 13,PI(), 3.1415.... 14,rand(),rand(n), 返回0-1之间的一个随机数 15,3,字符串函数 16, 17,ascii(), 将字符转换为ASCII码, ASCII('abc') = 97 18,char(), ASCII 码转换为字符 19,low(),upper() 20,str(a,b,c)转换数字为字符串。a,是要转换的字符串。b是转换以后的长度,c是小数位数。 str(123.456,8,2) = 123.46 21,ltrim(), rtrim() 去空格 22,left(n), right(n), substring(str, start,length) 截取字符串 23,charindex(子串,母串),查找是否包含。返回第一次出现的位置,没有返回0 24,patindex('%pattern%', expression) 功能同上,可是使用通配符 25,replicate('char', rep_time), 重复字符串 26,reverse(char),颠倒字符串 27,replace(str, strold, strnew) 替换字符串 28,space(n), 产生n个空行 29,stuff(), SELECT STUFF('abcdef', 2, 3, 'ijklmn') ='aijklmnef', 2是开始位置,3是要从原来串中删除的字符长度,ijlmn是要插入的字符串。 30,3,类型转换函数: 31, 32,cast, cast( expression as data_type), Example: 33,SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales FROM titles WHERE CAST(ytd_sales AS char(20)) LIKE '3%' 34,convert(data_type, expression) 35,4,日期函数 36, 37,day(), month(), year() 38,dateadd(datepart, number, date), datapart指定对那一部分加,number知道加多少,date指定在谁的基础上加。datepart的取值包括,
SQL SERVER函数大全 SQL SERVER命令大全 SQLServer和Oracle的常用函数对比 1.绝对值 S:select abs(-1) value O:select abs(-1) value from dual 2.取整(大) S:select ceiling(-1.001) value O:select ceil(-1.001) value from dual 3.取整(小) S:select floor(-1.001) value O:select floor(-1.001) value from dual 4.取整(截取) S:select cast(-1.002 as int) value O:select trunc(-1.002) value from dual 5.四舍五入 S:select round(1.23456,4) value 1.23460 O:select round(1.23456,4) value from dual 1.2346 6.e为底的幂 S:select Exp(1) value 2.7182818284590451 O:select Exp(1) value from dual 2.71828182 7.取e为底的对数 S:select log(2.7182818284590451) value 1 O:select ln(2.7182818284590451) value from dual; 1 8.取10为底对数 S:select log10(10) value 1 O:select log(10,10) value from dual; 1 9.取平方 S:select SQUARE(4) value 16 O:select power(4,2) value from dual 16
在SQL Server在线图书或者在线帮助系统中,函数的可选参数用方括号表示。在下列的CONVERT()函数例子中,数据类型的length和style参数是可选的: CONVERT (data-type [(length)], expression[,style]) 可将它简化为如下形式,因为现在不讨论如何使用数据类型: CONVERT(date_type, expression[,style]) 根据上面的定义,CONVERT()函数可接受2个或3个参数。因此,下列两个例子都是正确的: SELECT CONVERT(Varchar(20),GETDATE()) SELECT CONVERT(Varchar(20),GETDATE(), 101) 这个函数的第一个参数是数据类型Varchar(20),第2个参数是另一个函数GETDATE()。GETDATE()函数用datetime数据类型将返回当前的系统日期和时间。第2条语句中的第3个参数决定了日期的样式。这个例子中的101指以mm/dd/yyyy格式返回日期。本章后面将详细介绍GETDATE()函数。即使函数不带参数或者不需要参数,调用这个函数时也需要写上一对括号,例如GETDATE()函数。注意在书中使用函数名引用函数时,一定要包含括号,因为这是一种标准形式。 确定性函数 由于数据库引擎的内部工作机制,SQL Server必须根据所谓的确定性,将函数分成两个不同的组。这不是一种新时代的信仰,只和能否根据其输入参数或执行对函数输出结果进行预测有关。如果函数的输出只与输入参数的值相关,而与其他外部因素无关,这个函数就是确定性函数。如果函数的输出基于环境条件,或者产生随机或者依赖结果的算法,这个函数就是非确定性的。例如,GETDATE()函数是非确定性函数,因为它不会两次返回相同的值。为什么要把看起来简单的事弄得如此复杂呢?主要原因是非确定性函数与全局变量不能在一些数据库编程对象中使用(如用户自定义函数)。部分原因是SQL Server缓存与预编译可执行对象的方式。例如,即席查询可以使用任何函数,不过如果打算构建先进的、可重用的编程对象,理解这种区别很重要。 以下这些函数是确定性的: ●?AVG()(所有的聚合函数都是确定性的) ●?CAST() ●?CONVERT() ●?DATEADD() ●?DATEDIFF() ●?ASCII() ●?CHAR() ●?SUBSTRING() 以下这些函数与变量是非确定性的: ●?GETDATE()
SQL Server用户自定义函数 用户自定义函数不能用于执行一系列改变数据库状态的操作,但它可以像系统函数一样在查询或存储过程等的程序段中使用,也可以像存储过程一样通过EXECUTE 命令来执行。在 SQL Server 中根据函数返回值形式的不同将用户自定义函数分为三种类型: (1) 标量函数 标量函数返回一个确定类型的标量值,其返回值类型为除 TEXT 、 NTEXT 、IMAGE 、 CURSOR 、 TIMESTAMP 和 TABLE 类型外的其它数据类型。函数体语句定义 在 BEGIN-END 语句内。在 RETURNS 子句中定义返回值的数据类型,并且函数的最后一条语句必须为 Return 语句。创建标量函数的格式: Create Function 函数名(参数) Returns 返回值数据类型 [With {Encryption|Schemabinding}] [AS] BEGIN SQL 语句 ( 必须有 Return 子句 ) END 举例: ******************************************************************* CREATE FUNCTION dbo.Max ( @a int, @b int ) RETURNS int AS BEGIN DECLARE @max int IF @a>@b SET @max=@a ELSE SET @max=@b Return @max END *******************************************************************调用标量函数可以在 T-SQL 语句中允许使用标量表达式的任何位置调用返 回标量值(与标量表达式的数据类型相同)的任何函数。必须使用至少由两部分组成名称的函数来调用标量值函数,即架构名 . 对象名,如 dbo.Max(12,34) 。 (2) 内联表值函数 内联表值型函数以表的形式返回一个返回值,即它返回的是一个表。内联表 值型函数没有由 BEGIN-END 语句括起来的函数体。其返回的表是由一个位于RETURN 子句中的 SELECT 命令从数据库中筛选出来。内联表值型函数功能相当 于一个参数化的视图。
锁 锁是网络数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性。各种大型数据库所采用的锁的基本理论是一致的,但在具体实现上各有差别。目前,大多数数据库管理系统都或多或少具有自我调节、自我管理的功能,因此很多用户实际上不清楚锁的理论和所用数据库中锁的具体实现。 Microsoft SQL Server(以下简称SQL Server)作为一种中小型数据库管理系统,已经得到了广泛的应用,该系统更强调由系统来管理锁。在用户有SQL请求时,系统分析请求,自动在满足锁定条件和系统性能之间为数据库加上适当的锁,同时系统在运行期间常常自动进行优化处理,实行动态加锁。对于一般的用户而言,通过系统的自动锁定管理机制基本可以满足使用要求,但如果对数据安全、数据库完整性和一致性有特殊要求,就必须自己控制数据库的锁定和解锁,这就需要了解SQL Server的锁机制,掌握数据库锁定方法。 锁的多粒度性以及锁升级 数据库中的锁是指一种软件机制,用来指示某个用户(也即进程会话,下同)已经占用了某种资源,从而防止其他用户做出影响本用户的数据修改或导致数据库数据的非完整性和非一致性。这儿所谓资源,主要指用户可以操作的数据行、索引以及数据表等。根据资源的不同,锁有多粒度(multigranular)的概念,也就是指可以锁定的资源的层次。SQL Server 中能够锁定的资源粒度包括:数据库、表、区域、页面、键值(指带有索引的行数据)、行标识符(RID,即表中的单行数据)。 采用多粒度锁的重要用途是用来支持并发操作和保证数据的完整性。SQL Server根据用户的请求,做出分析后自动给数据库加上合适的锁。假设某用户只操作一个表中的部分行数据,系统可能会只添加几个行锁(RID)或页面锁,这样可以尽可能多地支持多用户的并发操作。但是,如果用户事务中频繁对某个表中的多条记录操作,将导致对该表的许多记录行都加上了行级锁,数据库系统中锁的数目会急剧增加,这样就加重了系统负荷,影响系统性能。因此,在数据库系统中,一般都支持锁升级(lock escalation)。所谓锁升级是指调整锁的粒度,将多个低粒度的锁替换成少数的更高粒度的锁,以此来降低系统负荷。在SQL Server中当一个事务中的锁较多,达到锁升级门限时,系统自动将行级锁和页面锁升级为表级锁。特别值得注意的是,在SQL Server中,锁的升级门限以及锁升级是由系统自动来确定的,不需要用户设置。 锁的模式和兼容性 在数据库中加锁时,除了可以对不同的资源加锁,还可以使用不同程度的加锁方式,即锁有多种模式,SQL Server中锁模式包括: 1.共享锁 SQL Server中,共享锁用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的资源。默认情况下,数据被读取后,SQL Server立即释放共享锁。例如,执行查询“SELECT * FROM my_table”时,首先锁定第一页,读取之后,释放对第一页的锁定,然后锁定第二页。这样,就允许在读操作过程中,修改未被锁定的第一页。但是,事务隔离级
sqlserver日期函数 SQLServer时间日期函数详解,SQLServer,时间日期, 1. 当前系统日期、时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础上,返回新的datetime 值 例如:向日期加上2天 select dateadd(day,2,'2004-10-15') --返回:2004-10-17 00:00:0 0.000 3. datediff 返回跨两个指定日期的日期和时间边界数。 select datediff(day,'2004-09-01','2004-09-18') --返回:17 select datediff(day,'2004-09-18','2004-09-01') --返回:-17 4. datepart 返回代表指定日期的指定日期部分的整数。 SELECT DATEPART(month, '2004-10-15') --返回10 5. datename 返回代表指定日期的指定日期部分的字符串 SELECT datename(weekday, '2004-10-15') --返回:星期五 6. day(), month(),year() --可以与datepart对照一下 select 当前日期=convert(varchar(10),getdate(),120) ,当前时间=convert(varchar(8),getdate(),114) select datename(dw,'2004-10-15') select 本年第多少周=datename(week,'2004-10-15') ,今天是周几=datename(weekday,'2004-10-15') 函数参数/功能 GetDate( ) 返回系统目前的日期与时间 DateDiff (interval,date1,date2) 以interval 指定的方式,返回date2 与date1两个日期之间的差值 date2-date1 DateAdd (interval,number,date) 以interval指定的方式,加上number之后的日期 DatePart (interval,date) 返回日期date中,interval指定部分所对应的整数值DateName (interval,date) 返回日期date中,interval指定部分所对应的字符串名称 参数interval的设定值如下: 值缩写(Sql Server)(Access 和ASP) 说明 Year Yy yyyy 年1753 ~ 9999 Quarter Qq q 季1 ~ 4 Month Mm m 月1 ~ 12
SQL Server 2005 函数大全 字符串函数 (2) 日期和时间函数 (3) 日期部分 (5) 数学函数 (6) 数据类型转换函数 (7) 日期类型数据转换为字符数据类型的日期格式的部分样式表 (8) 系统函数 (11) 排名函数 (11) 聚合函数 (12)
字符串函数 表达式:是常量、变量、列或函数等与运算符的任意组合。以下参数中表达式类型是指表达式经运算后返回的值的类型 函数名称参数示例说明 ascii (字符串表达式) select ascii('abc') 返回 97返回字符串中最左侧的字符的ASCII码。 char(整数表达式) select char(100) 返回 d 把ASCII 码转换为字符。 介于0 和255 之间的整数。如果该整数表达式不在此范围内,将返回NULL 值。 charindex (字符串表达式1,字符串表达式 2[,整数表达式]) select charindex('ab','BCabTabD')返回3 select charindex('ab','BCabTabD',4)返回6 在字符串2中查找字符串1,如果存在返回第一个匹配的 位置,如果不存在返回0。如果字符串1和字符串2中有一个 是null则返回null。 可以指定在字符串2中查找的起始位置。 difference (字符串表达式1,字符串表达式2) select difference('Green','Greene')返回4 返回一个0到4的整数值,指示两个字符表达式的之间的相似程度。0 表示几乎不同或完全不同,4表示几乎相同或完全相同。注意相似并不代表相等 left (字符串表达式,整数表达式) select left('abcdefg',2) 返回 ab返回字符串中从左边开始指定个数的字符。 right (字符串表达式,整数表达式) select right('abcdefg',2) 返回fg返回字符串中从右边开始指定个数的字符。 len(字符串表达式) select len('abcdefg')返回 7 select len('abcdefg ') 返回7 返回指定字符串表达式的字符数,其中不包含尾随空格。lower (字符串表达式) select lower('ABCDEF')返回 abcdef返回大写字符数据转换为小写的字符表达式。 upper (字符串表达式) select upper('abcdef')返回 ABCDEF返回小写字符数据转换为大写的字符表达式。 ltrim (字符串表达式) select ltrim(' abc')返回 abc返回删除了前导空格之后的字符表达式。 rtrim(字符串表达式) select rtrim('abc ')返回 abc返回删除了尾随空格之后的字符表达式。 patindex (字符串表达式1,字符串表达式2) select patindex('%ab%','123ab456')返回4 select patindex('ab%','123ab456')返回0 select patindex('___ab%','123ab456')返回1 select patindex('___ab_','123ab456')返回0 在字符串表达式1中可以使用通配符,此字符串的第一个 字符和最后一个字符通常是%。 %表示任意多个字符,_表示任意字符 返回字符串表达式2中字符串表达式1所指定模式第一次出现 的起始位置。没有找到返回0 reverse (字符串表达式) select reverse('abcde')返回 edcba返回指定字符串反转后的新字符串space (整数表达式) select'a'+space(2)+'b' 返回 a b返回由指定数目的空格组成的字符串。
事务的传播行为和隔离级别[transaction behavior and isolated level] Spring中事务的定义: 一、Propagation : key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用: PROPAGA TION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 PROPAGA TION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。PROPAGA TION_MANDA TORY--支持当前事务,如果当前没有事务,就抛出异常。PROPAGA TION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。PROPAGA TION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 PROPAGA TION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。 很多人看到事务的传播行为属性都不甚了解,我昨晚看了j2ee without ejb的时候,看到这里也不了解,甚至重新翻起数据库系统的教材书,但是也没有找到对这个的分析。今天搜索,找到一篇极好的分析文章,虽然这篇文章是重点分析PROPAGA TION_REQUIRED 和PROPAGA TION_REQUIRED_NESTED的 解惑spring 嵌套事务 /** * @author 王政 * @date 2006-11-24 * @note 转载自https://www.doczj.com/doc/9413069554.html,/topic/35907?page=1 */ ********TransactionDefinition 接口定义******************* /** * Support a current transaction, create a new one if none exists. * Analogous to EJB transaction attribute of the same name. * This is typically the default setting of a transaction definition. */ int PROPAGATION_REQUIRED = 0; /** * Support a current transaction, execute non-transactionally if none exists. * Analogous to EJB transaction attribute of the same name. * Note: For transaction managers with transaction synchronization,
第12章事务与锁机制 一、选择题 1.下面选项中,()不是数据库事务必须具备的特征。 A.原子性B.一致性C.孤立性D.适时性 2.MySQL创建事务的一般步骤是()。 A.初始化事务、创建事务、应用SELECT查看事务、提交事务 B.初始化事务、应用SELECT查看事务、应用事务、提交事务 C.初始化事务、创建事务、应用事务、提交事务 D.创建事务、应用事务、应用SELECT查看事务、提交事务 3.事务的开始和结束命令分别是()。 A.START TRANSACTION、ROLLBACK B.START TRANSACTION、COMMIT C.START TRANSACTION、ROLLBACK或者COMMIT D.START TRANSACTION、BREAK 4.下面()选项不是ANSI/ISO SQL规范提供的隔离级别。 A.SERIALIZABLE B.REPEATABLE READ C.READ ROLLBACK D.READ UNCOMMITTED 5.下面控制事务自动提交的命令,正确的是()。 A.SET AUTOCOMMIT=0; B.SET AUTOCOMMIT=1; C.SELECT @@autocommit; D.SELECT @@tx_isolation; 6.在MySQL中,可以使用()命令开启一个事务。 A.START TRANSACTION B.BEGIN C.BEGIN WORK D.以上都是 7.下列关于读锁和写锁的区别描述正确的是()。 A.两个读锁是兼容的 B.一个读锁和一个写锁是不兼容的 25
26 C.两个写锁也是不兼容的 D.以上都正确 8.下列关于锁策略的描述错误的是()。 A.表级锁是MySQL中最基本的锁策略,而且是开销最小的策略。 B.行级锁可以最大程度地支持并发处理,同时也带来了最大的锁开销。 C.一个读锁请求可能会被插入到写锁队列的前面。 D.在MySQL中,每种存储引擎都可以实现自己的锁策略和锁粒度。 9.下列()语句可以将事务的隔离级别设置为读未提交数据。 A.SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; B.SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; C.SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; D.SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; 10.下列关于行级锁的描述错误的是()。 A.事务中的行级锁的生命周期从加锁开始,直到事务提交或者回滚才会被释放。 B.InnoDB表只能设置行级锁。 C.为了延长行级锁的生命周期,可以采用开启事务实现。 D.InnoDB表的行级锁的粒度仅仅是受查询语句或者更新语句影响的记录。 二、填空题 1.数据库事务必须具备___________________、___________________、___________________和___________________特征(简称ACID)。 2.在当前连接中,可以通过将_________________________变量设置为_________,来禁用自动提交功能。 3.在MySQL中,可以使用MySQL的_______________________命令查询_______________________变量的值,以确定MySQL的自动提交功能是否关闭。 4.在MySQL中,应用_______________________命令来标记一个事务的开始。 5.使用________________________命令实现在事务中设置一个回退点。 6.在处理并发读或者写时,可以通过实现________________锁和_______________锁来解决问题。 7.在MySQL中采用__________________存储引擎的数据表,并不支持COMMIT(提交)和ROLLBACK (回滚)命令。 8.为指定数据表添加锁定可以使用__________________________________________语句来实现,释放对表的锁定状态可以使用__________________________语句来实现。 9.以写方式锁定数据表可以使用_________________________________语句来实现。 10.在MySQL中,可以通过执行______________________________________命令设置事务的隔离级别。
Sql 2008 函数大全 SQL2008 表达式:是常量、变量、列或函数等与运算符的任意组合。 1. 字符串函数 函数名称参数示例说明 ascii(字符串表达式) select ascii('abc') 返回 97 返回字符串中最左侧的字符的ASCII 码。 char(整数表达式) select char(100) 返回 d 把ASCII 码转换为字符。 介于0 和 255 之间的整数。如果该整数表达式不在此围,将返回NULL 值。 charindex(字符串表达式 1, 字符串表达式2[,整数表达式]) select charindex('ab','BCabTabD') 返回 3 select charindex('ab','BCabTabD', 4) 返回 6 在字符串2 中查找字符串 1,如果存在返回第一个匹配的位置,如果不存在返回0。如果字符串 1 和字符串 2 中有一个是null 则返回 null。 可以指定在字符串2 中查找的起始位置。 difference(字符串表达式 1,字符串表达式 2) select difference('Green','Greene') 返回 4 返回一个0 到 4 的整数值,指示两个字符表达式的之间的相似程度。 0 表示几乎不同或完全不同, 4 表示几乎相同或完全相同。 注意相似并不代表相等 left(字符串表达式,整数表达式) select left('abcdefg',2) 返回 ab 返回字符串中从左边开始指定个数的字符。 //貌似下标从1开始? right(字符串表达式,整数表达式) select right('abcdefg',2) 返回 fg
锁机制防止多人存取资源时不至于混乱,而且防止阻塞。 一、锁的类型 如果某个事务已锁定一个资源,而另一事务又需要访问该资源,那么 Microsoft SQL Server 2005会根据第一个事务所用锁定模式的兼容性确定是否授予第二个锁。 对于已锁定的资源,只能施加兼容类型的锁。例如,如果持有排他 (X) 锁,那么,除非在第一个事务结束时释放该 X 锁,否则其他事务将无法获取该资源的共享锁、升级锁或排他锁。相反,如果已向某个资源应用共享 (S) 锁,那么,即使第一个事务尚未完成,其他事务也可以获取该资源的共享锁或升级 (U) 锁。但是,只有在释放共享锁之后,其他事务才可以获取排他锁。 资源的锁定模式有一个兼容性矩阵,可以显示哪些锁与在同一资源上获取的其他锁兼容,并按照锁强度递增的顺序列出这些锁。 下表显示了请求的锁定模式及其与现有锁定模式的兼容性: 请求的模式 IS S U IX SIX X 意向共享 (IS) 是 是 是 是 是 否 共享 (S) 是 是 是 否 否 否 升级 (U) 是 是 否 否 否 否 意向排他 (IX) 是 否 否 是 否 否 意向排他共享 (SIX) 是 否 否 否 否 否
排他 (X) 否 否 否 否 否 否 注意: IX 锁与 IX 锁定模式兼容,因为 IX 指示其意向是更新某些行,而不是更新所有行。只要不会影响其他事务正在更新的行,那么也允许其他事务读取或更新某些行。 Microsoft SQL Server Database Engine使用不同的锁模式锁定资源,这些锁模式确定了并发事务访问资源的方式。 下表显示了数据库引擎使用的资源锁模式。 锁模式 说明 共享 (S) 用于不更改或不更新数据的读取操作,如 SELECT 语句。 更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。 排他 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时对同一资源进行多重更新。 意向 用于建立锁的层次结构。意向锁的类型有:意向共享 (IS)、意向排他 (IX) 以及意向排他共享 (SIX)。 架构 在执行依赖于表架构的操作时使用。架构锁的类型有:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。 大容量更新 (BU) 在向表进行大容量数据复制且指定了 TABLOCK 提示时使用。 键范围 当使用可序列化事务隔离级别时保护查询读取的行的范围。确保再次运行查询时其他事务无法插入符合可序列化事务的查询的行。 共享锁 共享锁(S 锁)允许并发事务在封闭式并发控制(请参阅并发控制的类型)下读取 (SELECT) 资源。资源上存在共享锁(S 锁)时,任何