-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
567 lines (343 loc) · 29.1 KB
/
Copy pathindex.html
File metadata and controls
567 lines (343 loc) · 29.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Solar</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta property="og:type" content="website">
<meta property="og:title" content="Solar">
<meta property="og:url" content="http://yoursite.com/index.html">
<meta property="og:site_name" content="Solar">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Solar">
<link rel="alternate" href="/atom.xml" title="Solar" type="application/atom+xml">
<link rel="icon" href="/favicon.png">
<link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="/css/style.css">
</head>
<body>
<div id="container">
<div id="wrap">
<header id="header">
<div id="banner"></div>
<div id="header-outer" class="outer">
<div id="header-title" class="inner">
<h1 id="logo-wrap">
<a href="/" id="logo">Solar</a>
</h1>
</div>
<div id="header-inner" class="inner">
<nav id="main-nav">
<a id="main-nav-toggle" class="nav-icon"></a>
<a class="main-nav-link" href="/">Home</a>
<a class="main-nav-link" href="/archives">Archives</a>
</nav>
<nav id="sub-nav">
<a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
<a id="nav-search-btn" class="nav-icon" title="Search"></a>
</nav>
<div id="search-form-wrap">
<form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit"></button><input type="hidden" name="sitesearch" value="http://yoursite.com"></form>
</div>
</div>
</div>
</header>
<div class="outer">
<section id="main">
<article id="post-mysql中的CONCAT和GROUP-CONCAT" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/10/17/mysql中的CONCAT和GROUP-CONCAT/" class="article-date">
<time datetime="2017-10-17T15:37:07.000Z" itemprop="datePublished">2017-10-17</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/10/17/mysql中的CONCAT和GROUP-CONCAT/">mysql中的CONCAT和GROUP_CONCAT</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>一、CONCAT()函数<br>CONCAT()函数用于将多个字符串连接成一个字符串。<br>使用数据表Info作为示例,其中SELECT id,name FROM info LIMIT 1;的返回结果为<br>+—-+——–+<br>| id | name |<br>+—-+——–+<br>| 1 | BioCyc |<br>+—-+——–+<br>1、语法及使用特点:<br>CONCAT(str1,str2,…)<br>返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。可以有一个或多个参数。</p>
<p>2、使用示例:<br>SELECT CONCAT(id, ‘,’, name) AS con FROM info LIMIT 1;返回结果为<br>+———-+<br>| con |<br>+———-+<br>| 1,BioCyc |<br>+———-+</p>
<p>SELECT CONCAT(‘My’, NULL, ‘QL’);返回结果为<br>+————————–+<br>| CONCAT(‘My’, NULL, ‘QL’) |<br>+————————–+<br>| NULL |<br>+————————–+</p>
<p>3、如何指定参数之间的分隔符<br>使用函数CONCAT_WS()。使用语法为:CONCAT_WS(separator,str1,str2,…)<br>CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。但是CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。</p>
<p>如SELECT CONCAT<em>WS(‘</em>‘,id,name) AS con_ws FROM info LIMIT 1;返回结果为<br>+———-+<br>| con_ws |<br>+———-+<br>| 1_BioCyc |<br>+———-+</p>
<p>SELECT CONCAT_WS(‘,’,’First name’,NULL,’Last Name’);返回结果为<br>+———————————————-+<br>| CONCAT_WS(‘,’,’First name’,NULL,’Last Name’) |<br>+———————————————-+<br>| First name,Last Name |<br>+———————————————-+</p>
<p>二、GROUP_CONCAT()函数<br>GROUP_CONCAT函数返回一个字符串结果,该结果由分组中的值连接组合而成。<br>使用表info作为示例,其中语句SELECT locus,id,journal FROM info WHERE locus IN(‘AB086827’,’AF040764’);的返回结果为<br>+———-+—-+————————–+<br>| locus | id | journal |<br>+———-+—-+————————–+<br>| AB086827 | 1 | Unpublished |<br>| AB086827 | 2 | Submitted (20-JUN-2002) |<br>| AF040764 | 23 | Unpublished |<br>| AF040764 | 24 | Submitted (31-DEC-1997) |<br>+———-+—-+————————–+</p>
<p>1、使用语法及特点:<br>GROUP_CONCAT([DISTINCT] expr [,expr …]<br>[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] [,col …]]<br>[SEPARATOR str_val])<br>在 MySQL 中,你可以得到表达式结合体的连结值。通过使用 DISTINCT 可以排除重复值。如果希望对结果中的值进行排序,可以使用 ORDER BY 子句。<br>SEPARATOR 是一个字符串值,它被用于插入到结果值中。缺省为一个逗号 (“,”),可以通过指定 SEPARATOR “” 完全地移除这个分隔符。<br>可以通过变量 group_concat_max_len 设置一个最大的长度。在运行时执行的句法如下: SET [SESSION | GLOBAL] group_concat_max_len = unsigned_integer;<br>如果最大长度被设置,结果值被剪切到这个最大长度。如果分组的字符过长,可以对系统参数进行设置:SET @@global.group_concat_max_len=40000;</p>
<p>2、使用示例:<br>语句 SELECT locus,GROUP_CONCAT(id) FROM info WHERE locus IN(‘AB086827’,’AF040764’) GROUP BY locus; 的返回结果为<br>+———-+——————+<br>| locus | GROUP_CONCAT(id) |<br>+———-+——————+<br>| AB086827 | 1,2 |<br>| AF040764 | 23,24 |<br>+———-+——————+</p>
<p>语句 SELECT locus,GROUP<em>CONCAT(distinct id ORDER BY id DESC SEPARATOR ‘</em>‘) FROM info WHERE locus IN(‘AB086827’,’AF040764’) GROUP BY locus;的返回结果为<br>+———-+———————————————————-+<br>| locus | GROUP<em>CONCAT(distinct id ORDER BY id DESC SEPARATOR ‘</em>‘) |<br>+———-+———————————————————-+<br>| AB086827 | 2_1 |<br>| AF040764 | 24_23 |<br>+———-+———————————————————-+</p>
<p>语句SELECT locus,GROUP_CONCAT(concat_ws(‘, ‘,id,journal) ORDER BY id DESC SEPARATOR ‘. ‘) FROM info WHERE locus IN(‘AB086827’,’AF040764’) GROUP BY locus;的返回结果为<br>+———-+————————————————————————–+<br>| locus | GROUP_CONCAT(concat_ws(‘, ‘,id,journal) ORDER BY id DESC SEPARATOR ‘. ‘) |<br>+———-+————————————————————————–+<br>| AB086827 | 2, Submitted (20-JUN-2002). 1, Unpublished |<br>| AF040764 | 24, Submitted (31-DEC-1997) . 23, Unpublished |<br>+———-+————————————————————————–+</p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/10/17/mysql中的CONCAT和GROUP-CONCAT/" data-id="cje6j64b50006e4vv46yodb53" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-Lambda学习" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/09/30/Lambda学习/" class="article-date">
<time datetime="2017-09-30T09:12:18.000Z" itemprop="datePublished">2017-09-30</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/09/30/Lambda学习/">Lambda学习</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>一、Lambda特征<br><br> a.匿名<br><br> b.函数——参数列表、函数主体、返回类型、异常列表<br><br> c.传递——可以作为参数传递给方法或存储在变量中<br><br> d.简洁<br><br>二、Lambda语法<br><br> <figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">(parameters)-> expression</div><div class="line">(parameters)-> {statements;}</div></pre></td></tr></table></figure></p>
<p>三、Lambda的组成<br><br> <figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">(String s)->s.length();</div></pre></td></tr></table></figure></p>
<ul>
<li>参数列表</li>
<li>箭头</li>
<li>Lambda主体<br></li>
</ul>
<p>四、有效的Lambda表达式<br></p>
<ul>
<li>(String s)->s.length()<br><br>Lambda没有return语句,因为已经隐含了return</li>
<li>(Apple a)->a.getWeight()>150</li>
<li>(int x,int y)->{System.out.println(“result”);<br>System.out.println(x+y);}</li>
<li>()->42</li>
<li>(Apple a1,Apple a2)->a1.getWeight().comparTo(a2.getWeight());<br></li>
</ul>
<p>五、其他概念<br><br> 函数式接口:只定义一个抽象方法的接口<br><br> 函数描述符:函数式接口中的方法</p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/09/30/Lambda学习/" data-id="cje6j64ar0000e4vv3bdm8hm9" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-Linux下检查是否安装过某安装包" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/09/30/Linux下检查是否安装过某安装包/" class="article-date">
<time datetime="2017-09-30T03:51:01.000Z" itemprop="datePublished">2017-09-30</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/09/30/Linux下检查是否安装过某安装包/">Linux下检查是否安装过某安装包</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>1、rpm包安装的,可以用 rpm -qa 看到,如果要查找某软件包是否安装,用 rpm -qa | grep “软件或者包的名字”<br><br>2、以deb包安装的,可以用 dpkg -l 看到。如果是查找指定软件包,用 dpkg -l | grep “软件或者包的名字”<br><br>3、yum方法安装的,可以用 yum list installed 查找,如果是查找指定包,用 yum list installed | grep “软件名或者包名”</p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/09/30/Linux下检查是否安装过某安装包/" data-id="cje6j64ax0001e4vvucvhvlii" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-git-pull-强制覆盖本地文件的命令" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/09/30/git-pull-强制覆盖本地文件的命令/" class="article-date">
<time datetime="2017-09-30T03:40:56.000Z" itemprop="datePublished">2017-09-30</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/09/30/git-pull-强制覆盖本地文件的命令/">git pull 强制覆盖本地文件的命令</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>git fetch -all<br><br>git reset –hard origin/master<br><br>git pull</p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/09/30/git-pull-强制覆盖本地文件的命令/" data-id="cje6j64b30004e4vvia9uj02x" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-windows和linux查看端口占用情况" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/09/30/windows和linux查看端口占用情况/" class="article-date">
<time datetime="2017-09-30T02:25:39.000Z" itemprop="datePublished">2017-09-30</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/09/30/windows和linux查看端口占用情况/">windows和linux查看端口占用情况</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>一、windows下<br><br> a.调用cmd<br><br> b.输入命令:netstat -ano,列出所有端口的情况<br><br> c.查看被占用端口对应的PID,输入命令:<br> <figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">netstat -ano|findstr <span class="string">"xxx"</span></div></pre></td></tr></table></figure></p>
<p> 记下最后的PID <br><br> d.查看占用进程的程序<br><br> <figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">tasklist|findstr <span class="string">"yyy"</span></div></pre></td></tr></table></figure></p>
<p> e.结束进程<br><br> tskill PID<br><br> taskkill /f /t /im zzz.exe<br><br>二、linux<br><br> a.lsof -i:端口号<br><br> b.netstat命令<br><br> -t:仅显示tcp相关选项<br><br> -u:仅显示udp相关选项<br><br> -n:拒绝显示别名,能显示数字的全部转化为数字<br><br> -l:仅列出有在Listen(监听)的服务状态<br><br> -p:显示建立相关连接的程序名<br></p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/09/30/windows和linux查看端口占用情况/" data-id="cje6j64b70008e4vvbno08n30" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-List和String相互转化" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/09/29/List和String相互转化/" class="article-date">
<time datetime="2017-09-29T01:02:54.000Z" itemprop="datePublished">2017-09-29</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/09/29/List和String相互转化/">List和String相互转化</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>一:List转String<br>1、List用指定字符分割,得到String<br><br> jdk1.8推出的新方法<br><br> a.String join(CharSequence delimiter,CharSequence…elements)<br><br> b.String join(CharSequence delimiter,Iterable<? extends CharSequence>elements)<br><br> 两个都是静态方法,这里用b就行,把List按照指定分隔符,生成String<br><br><br>2、用List的toArray()方法<br> toArray有两个重载方法:<br> a.list.toArray();<br> b.list.toArray(T[] a);<br> 得到String数组后,循环遍历得到String对象</p>
<p>二:String转List<br>1、String通过某个字符split,创建list<br> 关于String.split(String regex,int limit)<br><br> a.limit n>0,则pattern(模式)应用n-1次<br><br> b.limit n<0,则pattern应用无限次<br><br> c.limit n=0,则pattern应用无限次并且省略末尾的空字符<br><br> ——————我是分割线——————————–<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">String[] userName={<span class="string">"aa"</span>,<span class="string">"bb"</span>,<span class="string">"cc"</span>};</div><div class="line">List<String> userList=<span class="keyword">new</span> Array<String>();</div><div class="line">Collections.addAll(userName,userList); </div><div class="line"></div><div class="line">String[] userId={<span class="string">"1"</span>,<span class="string">"2"</span>,<span class="string">"3"</span>};</div><div class="line">List<String> userList2=Arrays.asList(usrId);</div></pre></td></tr></table></figure></0,则pattern应用无限次<br></p>
<p> Arrays.asList()返回一个受指定数组支持的固定大小的列表。所以不能做Add、Remove等操作。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">List<String> list=<span class="keyword">new</span> ArrayList<>(Arrays.asList(userId));</div><div class="line">List<String list2=<span class="keyword">new</span> ArrayList<>(Collections.singletonList(userId));</div></pre></td></tr></table></figure></p>
<p> </p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/09/29/List和String相互转化/" data-id="cje6j64b00002e4vvbrq2hhq0" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-开发中事务的传播特性引发的问题" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/09/18/开发中事务的传播特性引发的问题/" class="article-date">
<time datetime="2017-09-18T15:20:44.000Z" itemprop="datePublished">2017-09-18</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/09/18/开发中事务的传播特性引发的问题/">开发中事务的传播特性引发的问题</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p> 前提:<br><br> 1、项目中遇到了多线程并发的问题,因为考虑到数据库可以做到随意更换,所以并没有在数据库中加锁,而是在java代码中做了同步。<br><br> 2、基于1,数据库没有采用序列或者主键自增的方法,而是新增了一张叫TABLE_KEY的表,存储其他表中表名和主键值,当insert的时候,从TABLE_KEY中取相应表名的主键值然后update相应表名的主键值<br><br><br> 在什么地方加锁?<br><br> 原先的方案:<br><br> 在service层中某insert方法内封装的操作TABLE_KEY表的方法(假设叫foo)上加排他锁,service本身不加锁。<br><br><br> 产生的问题:<br><br> 测试的时候,数据库报错:违反了主键唯一性<br><br><br> 原因:<br><br> 项目采用的事务传播特性为:PROPAGATION_REQUIRED,即:<br><br> 如果当前没有事务,就新建一个事务,如果已经存在一个事务,就加入到这个事务中。<br><br> 就像两个事务的嵌套,内部事务依赖了外部事务,导致项目中foo中update没有commit,ThreadA处理完之后解锁,ThreadB重新加锁但query的还是没有update的数据,所以会产生违反主键唯一性的错误。<br><br><br> 目前解决办法:在service方法上加锁。<br><br><br></p>
<p> Spring提供的事务传播特性:</p>
<ul>
<li>PROPAGATION_REQUIRED:<br>如果当前没有事务,就新建一个事务,如果已经存在一个事务,就加入到这个事务中。这是最常见的选择。</li>
<li>PROPAGATION_SUPPORTS:<br>支持当前事务,如果当前没有事务,就以非事务方式执行。</li>
<li>PROPAGATION_MANDATORY:<br>使用当前的事务,如果当前没有事务,就抛出异常。</li>
<li>PROPAGATION_REQUIRES_NEW:<br>新建事务,如果当前存在事务,把当前事务挂起。</li>
<li>PROPAGATION_NOT_SUPPORTED:<br>以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。</li>
<li>PROPAGATION_NEVER:<br>以非事务方式执行,如果当前存在事务,则抛出异常。</li>
<li>PROPAGATION_NESTED:<br>如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。</li>
</ul>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/09/18/开发中事务的传播特性引发的问题/" data-id="cje6j64bb000be4vvlm4vjb5a" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-oracle获取数据库中所有有主键的表名,插入另一张表中" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/09/18/oracle获取数据库中所有有主键的表名,插入另一张表中/" class="article-date">
<time datetime="2017-09-18T06:29:23.000Z" itemprop="datePublished">2017-09-18</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/09/18/oracle获取数据库中所有有主键的表名,插入另一张表中/">oracle获取数据库中所有有主键的表名,插入另一张表中</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">insert into table_key(name)select ut.table_name from user_tables ut,user_constraints uc where ut.TABLE_NAME=uc.table_name and uc.constraint_type=<span class="string">'P'</span>;</div></pre></td></tr></table></figure>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/09/18/oracle获取数据库中所有有主键的表名,插入另一张表中/" data-id="cje6j64b60007e4vv3cdvgs2w" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-开发中遇到的数据库更新丢失问题" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/09/17/开发中遇到的数据库更新丢失问题/" class="article-date">
<time datetime="2017-09-17T15:14:21.000Z" itemprop="datePublished">2017-09-17</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/09/17/开发中遇到的数据库更新丢失问题/">开发中遇到的数据库更新丢失问题</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>我自己测试的时候发现有更新丢失的现象,还是第一次发现这个问题,研究了一下<br><br>前提:什么是数据库更新丢失?<br><br>举个栗子,假设有如下情况:<br><br> 1、小A查询了数据库<br><br> 2、小B也查询了数据库,两个人不在同一个session中<br><br> 3、小A修改了数据库中的一行,并提交<br><br> 4、小B也修改了数据库的一行,但提交晚于小A<br><br> 这个时候,小B的修改会覆盖小A的修改,就发生了数据库更新丢失的问题<br></p>
<p> 解决方案:<br><br> 1、悲观锁<br><br> 通过采用select for update或者select for update nowait,<br><br> 逻辑是:<br><br> 小A先查<br> <br><br> <img src="../images/success.PNG" alt=""><br> 小B后查<br> <img src="../images/errorupdate.png" alt=" "><br> 小B的查询会锁住,在页面的表现应该就是阻塞,什么数据也没有。<br><br><br> 2、乐观锁<br><br> 采用在数据库中表中加版本号和时间戳的形式进行加锁,项目中采用的是时间戳的形式,因为个别表中有这个字段:op_tm–操作时间。<br><br> 逻辑是:<br><br> 在update的时候,比较旧的时间戳,因为所有更新都会更新时间戳,那么最后一次更新也就是步骤四中的时间戳还是旧的时间戳,但已经被步骤三的替代了,所以步骤四的更新会失败。步骤三的更新得以保存,步骤四的“丢失”。步骤四的“丢失”算不算更新丢失,不算,因为是建立在错误数据的更新。<br><br> <img src="../images/updateoptm.PNG" alt=" "></p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/09/17/开发中遇到的数据库更新丢失问题/" data-id="cje6j64bb000ce4vvpmd2fblj" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-前台json获取数据为undefined" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/09/14/前台json获取数据为undefined/" class="article-date">
<time datetime="2017-09-13T16:16:45.000Z" itemprop="datePublished">2017-09-14</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/09/14/前台json获取数据为undefined/">前台json获取数据为undefined</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p> 现在是凌晨17分,好困,不过有个问题刚刚解决。。。<br><br> 后台传json参数去前台,但前台获取的时候alert的是undefined<br><br> 原来是ajax的dataType没有写,js代码不认为它是json。dataType的含义是客户端预期服务器返回的类型。所以,加上<br> ```java<br> dataType:json</p>
<p> 就行了。睡觉😴</p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/09/14/前台json获取数据为undefined/" data-id="cje6j64b90009e4vvci668f7f" class="article-share-link">Share</a>
</footer>
</div>
</article>
<nav id="page-nav">
<span class="page-number current">1</span><a class="page-number" href="/page/2/">2</a><a class="extend next" rel="next" href="/page/2/">__('next') »</a>
</nav>
</section>
<aside id="sidebar">
<div class="widget-wrap">
<h3 class="widget-title">Archives</h3>
<div class="widget">
<ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/10/">October 2017</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/09/">September 2017</a></li></ul>
</div>
</div>
<div class="widget-wrap">
<h3 class="widget-title">Recent Posts</h3>
<div class="widget">
<ul>
<li>
<a href="/2017/10/17/mysql中的CONCAT和GROUP-CONCAT/">mysql中的CONCAT和GROUP_CONCAT</a>
</li>
<li>
<a href="/2017/09/30/Lambda学习/">Lambda学习</a>
</li>
<li>
<a href="/2017/09/30/Linux下检查是否安装过某安装包/">Linux下检查是否安装过某安装包</a>
</li>
<li>
<a href="/2017/09/30/git-pull-强制覆盖本地文件的命令/">git pull 强制覆盖本地文件的命令</a>
</li>
<li>
<a href="/2017/09/30/windows和linux查看端口占用情况/">windows和linux查看端口占用情况</a>
</li>
</ul>
</div>
</div>
</aside>
</div>
<footer id="footer">
<div class="outer">
<div id="footer-info" class="inner">
© 2018 solar<br>
Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
</div>
</div>
</footer>
</div>
<nav id="mobile-nav">
<a href="/" class="mobile-nav-link">Home</a>
<a href="/archives" class="mobile-nav-link">Archives</a>
</nav>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
<script src="/fancybox/jquery.fancybox.pack.js"></script>
<script src="/js/script.js"></script>
</div>
</body>
</html>