1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml">
4  <head>
5    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6    <title>Chapter 2. Enabling Transactions</title>
7    <link rel="stylesheet" href="gettingStarted.css" type="text/css" />
8    <meta name="generator" content="DocBook XSL Stylesheets V1.62.4" />
9    <link rel="home" href="index.html" title="Getting Started with Berkeley DB Transaction Processing" />
10    <link rel="up" href="index.html" title="Getting Started with Berkeley DB Transaction Processing" />
11    <link rel="previous" href="perftune-intro.html" title="Performance Tuning" />
12    <link rel="next" href="envopen.html" title="Opening a Transactional Environment and&#10;            &#10;            Store or Database&#10;            &#10;        " />
13  </head>
14  <body>
15    <div class="navheader">
16      <table width="100%" summary="Navigation header">
17        <tr>
18          <th colspan="3" align="center">Chapter 2. Enabling Transactions</th>
19        </tr>
20        <tr>
21          <td width="20%" align="left"><a accesskey="p" href="perftune-intro.html">Prev</a> </td>
22          <th width="60%" align="center"> </th>
23          <td width="20%" align="right"> <a accesskey="n" href="envopen.html">Next</a></td>
24        </tr>
25      </table>
26      <hr />
27    </div>
28    <div class="chapter" lang="en" xml:lang="en">
29      <div class="titlepage">
30        <div>
31          <div>
32            <h2 class="title"><a id="enabletxn"></a>Chapter 2. Enabling Transactions</h2>
33          </div>
34        </div>
35        <div></div>
36      </div>
37      <div class="toc">
38        <p>
39          <b>Table of Contents</b>
40        </p>
41        <dl>
42          <dt>
43            <span class="sect1">
44              <a href="enabletxn.html#environments">Environments</a>
45            </span>
46          </dt>
47          <dd>
48            <dl>
49              <dt>
50                <span class="sect2">
51                  <a href="enabletxn.html#filenaming">File Naming</a>
52                </span>
53              </dt>
54              <dt>
55                <span class="sect2">
56                  <a href="enabletxn.html#errorsupport">Error Support</a>
57                </span>
58              </dt>
59              <dt>
60                <span class="sect2">
61                  <a href="enabletxn.html#sharedmemory">Shared Memory Regions</a>
62                </span>
63              </dt>
64              <dt>
65                <span class="sect2">
66                  <a href="enabletxn.html#security">Security Considerations</a>
67                </span>
68              </dt>
69            </dl>
70          </dd>
71          <dt>
72            <span class="sect1">
73              <a href="envopen.html">Opening a Transactional Environment and
74            
75            Store or Database
76            
77        </a>
78            </span>
79          </dt>
80        </dl>
81      </div>
82      <p>
83        In order to use transactions with your application, you must turn them
84        on. To do this you must: 
85  </p>
86      <div class="itemizedlist">
87        <ul type="disc">
88          <li>
89            <p>
90            Use an 
91            environment (see <a href="enabletxn.html#environments">Environments</a> for details).
92        </p>
93          </li>
94          <li>
95            <p>
96            Turn on transactions for your environment.
97
98            <span>
99            You do this by using the
100            <tt class="methodname">EnvironmentConfig.setTransactional()</tt>
101            method.
102            </span>
103
104            
105
106            <span>
107                Note that initializing the transactional subsystem implies that
108                the logging subsystem is also initialized. Also, note that
109                if you do not initialize transactions when you first create
110                your environment, then you cannot use transactions for that
111                environment after that. This is because DB
112                allocates certain structures needed for transactional
113                locking that are not available if the environment is
114                created without transactional support.
115            </span>
116        </p>
117          </li>
118          <li>
119            <p>
120            Initialize the in-memory cache by
121                
122
123                <span>
124                    passing <tt class="literal">true</tt> to the
125                    <tt class="methodname">EnvironmentConfig.setInitializeCache()</tt>
126                    method.
127                </span>
128        </p>
129          </li>
130          <li>
131            <p>
132            Initialize the locking subsystem. This is what provides locking for concurrent applications. It also is used
133            to perform deadlock detection. See <a href="txnconcurrency.html">Concurrency</a>
134            for more information.
135        </p>
136            <p>
137            You initialize the locking subsystem by
138                
139
140                <span>
141                    passing <tt class="literal">true</tt> to the
142                    <tt class="methodname">EnvironmentConfig.setInitializeLocking()</tt>
143                    method.
144                </span>
145        </p>
146          </li>
147          <li>
148            <p>
149                If you are using the DPL, transaction-enable your stores.
150                You do this by using the 
151                <tt class="methodname">StoreConfig.setTransactional() method.</tt>
152            </p>
153          </li>
154          <li>
155            <p>
156            <span>
157                    Transaction-enable your databases. 
158            </span>
159            <span>
160                    If you are using the base API, transaction-enable your databases. 
161            </span>
162            You do this by
163            <span>
164                using the
165                <tt class="methodname">DatabaseConfig.setTransactional()</tt>
166                method, and then opening the database from within a transaction.
167            </span>
168
169            
170            
171            
172
173             <span>
174             Note that the common practice is for auto commit to be used to
175             transaction-protect the database open. To use auto-commit, you
176             must still enable transactions as described here, but you do
177             not have to explicitly use a transaction when you open your
178             database. An example of this is given in the next section.
179             </span>
180        </p>
181          </li>
182        </ul>
183      </div>
184      <div class="sect1" lang="en" xml:lang="en">
185        <div class="titlepage">
186          <div>
187            <div>
188              <h2 class="title" style="clear: both"><a id="environments"></a>Environments</h2>
189            </div>
190          </div>
191          <div></div>
192        </div>
193        <p>
194        For simple DB applications, environments are optional. However, in
195        order to transaction protect your database operations, you must use an
196        environment.
197    </p>
198        <p>
199        An <span class="emphasis"><em>environment</em></span>, represents an
200        encapsulation of one or more databases and any associated log and
201        region files.  They are used to support multi-threaded 
202        and multi-process applications by allowing different threads of
203        control to share the in-memory cache, the locking tables, the
204        logging subsystem, and the file namespace. By sharing these things,
205        your concurrent application is more efficient than if each thread
206        of control had to manage these resources on its own.
207    </p>
208        <p>
209        By default all DB databases are backed by files on disk.  In
210        addition to these files, transactional DB applications create
211        logs that are also by default stored on disk (they can optionally
212        be backed using shared memory). Finally, transactional
213        DB applications also create and use shared-memory regions that
214        are also typically backed by the filesystem. But like databases and
215        logs, the regions can be maintained strictly in-memory if your
216        application requires it. For an example of an application that
217        manages all environment files in-memory, see
218            
219            <span><a href="inmem_txnexample_java.html">Base API In-Memory Transaction Example</a>.</span>
220            
221            
222    </p>
223        <div class="sect2" lang="en" xml:lang="en">
224          <div class="titlepage">
225            <div>
226              <div>
227                <h3 class="title"><a id="filenaming"></a>File Naming</h3>
228              </div>
229            </div>
230            <div></div>
231          </div>
232          <p>
233            In order to operate, your DB application must be able to
234            locate its database files, log files, and region files. If these
235            are stored in the filesystem, then you must tell DB where
236            they are located (a number of mechanisms exist that allow you to
237            identify the location of these files – see below). Otherwise, 
238            by default they are located in the current working directory.
239        </p>
240          <div class="sect3" lang="en" xml:lang="en">
241            <div class="titlepage">
242              <div>
243                <div>
244                  <h4 class="title"><a id="envhome"></a>Specifying the Environment Home Directory</h4>
245                </div>
246              </div>
247              <div></div>
248            </div>
249            <p>
250                The environment home directory is used to determine where
251                DB files are located.  Its location
252                is identified using one of the following mechanisms, in the
253                following order of priority:
254            </p>
255            <div class="itemizedlist">
256              <ul type="disc">
257                <li>
258                  <p>
259                        If no information is given as to where to put the
260                        environment home, then the current working
261                        directory is used.
262                    </p>
263                </li>
264                <li>
265                  <p>
266                    If a home directory is specified on the 
267                        
268                        
269                        <tt class="methodname">Environment()</tt>
270                    
271                    <span>constructor,</span>
272                    then that location is always used for the environment
273                    home.
274                    </p>
275                </li>
276                <li>
277                  <p>
278                        If a home directory is not supplied to 
279                         
280                        
281                        <span><tt class="methodname">Environment()</tt>, </span>
282                        then the directory identified by the <tt class="literal">DB_HOME</tt> environment variable
283                        is used <span class="emphasis"><em>if</em></span> you specify
284                            
285
286                            <span>
287                                <tt class="literal">true</tt> to either the
288                                <tt class="methodname">EnvironmentConfig.setUseEnvironment()</tt>
289                                or
290                                <tt class="methodname">EnvironmentConfig.setUseEnvironmentRoot()</tt>
291                                method.  Both methods allow you to identify the
292                                path to the environment's home directory
293                                using <tt class="literal">DB_HOME</tt>. However,
294                                <tt class="methodname">EnvironmentConfig.setUseEnvironmentRoot()</tt>
295                                is honored only if the process is run with root or administrative privileges.
296                            </span>
297                    </p>
298                </li>
299              </ul>
300            </div>
301          </div>
302          <div class="sect3" lang="en" xml:lang="en">
303            <div class="titlepage">
304              <div>
305                <div>
306                  <h4 class="title"><a id="filelocation"></a>Specifying File Locations</h4>
307                </div>
308              </div>
309              <div></div>
310            </div>
311            <p>
312                By default, all DB files are created relative to the environment
313                home directory. For example, suppose your environment home is in 
314                    <tt class="literal">/export/myAppHome</tt>. Also suppose you name your database 
315                    <span><tt class="literal">data/myDatabase.db</tt>.</span>
316                    
317                Then in this case, the database is placed in:
318                    <span><tt class="literal">/export/myAppHome/data/myDatabase.db</tt>.</span>
319                    
320            </p>
321            <p>
322            That said, DB always defers to absolute pathnames.
323            This means that if you provide an absolute filename when you 
324            name your database, then that file is <span class="emphasis"><em>not</em></span>
325            placed relative to the environment home directory. Instead, it
326            is placed in the exact location that you specified for the
327            filename.
328         </p>
329            <p>
330            On UNIX systems, an absolute pathname is a name that begins with a
331            forward slash ('/'). On Windows systems, an absolute pathname is a
332            name that begins with one of the following:
333        </p>
334            <div class="itemizedlist">
335              <ul type="disc">
336                <li>
337                  <p>
338                    A backslash ('\').
339                </p>
340                </li>
341                <li>
342                  <p>
343                    Any alphabetic letter, followed by a colon (':'), followed
344                    by a backslash ('\').
345                </p>
346                </li>
347              </ul>
348            </div>
349            <div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
350              <h3 class="title">Note</h3>
351              <p>
352                Try not to use absolute path names for your 
353                environment's files. Under certain recovery scenarios, absolute path names can
354                render your environment unrecoverable. This occurs if you are attempting to recover 
355                you environment on a system that does not support the absolute path name that you used.
356            </p>
357            </div>
358          </div>
359          <div class="sect3" lang="en" xml:lang="en">
360            <div class="titlepage">
361              <div>
362                <div>
363                  <h4 class="title"><a id="splittingdata"></a>Identifying Specific File Locations</h4>
364                </div>
365              </div>
366              <div></div>
367            </div>
368            <p>
369                As described in the previous sections, DB will place all its
370                files in or relative to the environment home directory.
371                You can also cause a
372                specific database file to be placed in a particular location by
373                using an absolute path name for its name. In this
374                situation, the environment's home directory is not
375                considered when naming the file.
376            </p>
377            <p>
378                It is frequently desirable to place database, log, and region files on separate
379                disk drives. By spreading I/O across multiple drives, you
380                can increase parallelism and improve throughput.
381                Additionally, by placing log files and database files on
382                separate drives, you improve your application's
383                reliability by providing your application with a greater
384                chance of surviving a disk failure.
385            </p>
386            <p>
387                You can cause DB's files to be placed in specific
388                locations using the following mechanisms:
389            </p>
390            <div class="informaltable">
391              <table border="1" width="80%">
392                <colgroup>
393                  <col />
394                  <col />
395                </colgroup>
396                <thead>
397                  <tr>
398                    <th>File Type</th>
399                    <th>To Override</th>
400                  </tr>
401                </thead>
402                <tbody>
403                  <tr>
404                    <td>database files</td>
405                    <td>
406                      <p>
407                                You can cause database files to be created
408                                in a directory other than the
409                                environment home by using the
410                                    
411                                    
412                                    <tt class="methodname">EnvironmentConfig.addDataDir()</tt>
413                                method. 
414                                The directory identified
415                                here must exist. If a relative path is
416                                provided, then the directory location is
417                                resolved relative to the environment's home
418                                directory.
419                                </p>
420                      <p>
421                                This method modifies the directory
422                                used for database files created and managed by
423                                a single environment handle; it does not
424                                configure the entire environment. 
425                                
426                                </p>
427                      <p>
428                                You can also set a default data location that is used by
429                                the entire environment by using the
430                                <tt class="literal">set_data_dir</tt> parameter
431                                in the environment's <tt class="literal">DB_CONFIG</tt> file.
432                                Note that the <tt class="literal">set_data_dir</tt>
433                                parameter overrides any value set by the
434                                    
435                                    
436                                    <tt class="methodname">EnvironmentConfig.addDataDir()</tt>
437                                method.
438                                </p>
439                    </td>
440                  </tr>
441                  <tr>
442                    <td>Log files</td>
443                    <td>
444                      <p>
445                            You can cause log files to be created
446                            in a directory other than the environment home
447                            directory by using the
448                                    
449                                    
450                                    <tt class="methodname">EnvironmentConfig.LogDirectory()</tt>
451                                method.  The directory identified
452                                here must exist. If a relative path is
453                                provided, then the directory location is
454                                resolved relative to the environment's home
455                                directory.
456                             </p>
457                      <p>
458                                This method modifies the directory
459                                used for database files created and managed by
460                                a single environment handle; it does not
461                                configure the entire environment. 
462                                
463                                </p>
464                      <p>
465                                You can also set a default log file location that is used by
466                                the entire environment by using the
467                                <tt class="literal">set_lg_dir</tt> parameter
468                                in the environment's <tt class="literal">DB_CONFIG</tt> file.
469                                Note that the <tt class="literal">set_lg_dir</tt>
470                                parameter overrides any value set by the
471                                    
472                                    
473                                    <tt class="methodname">EnvironmentConfig.LogDirectory()</tt>
474                                method.
475                                </p>
476                    </td>
477                  </tr>
478                  <tr>
479                    <td>Region files</td>
480                    <td>
481                                If backed by the filesystem, region
482                                files are always placed in the environment home
483                                directory.
484                            </td>
485                  </tr>
486                </tbody>
487              </table>
488            </div>
489            <p>
490            Note that the <tt class="literal">DB_CONFIG</tt> must reside in the
491            environment home directory. Parameters are specified in it one
492            parameter to a line. Each parameter is followed by a space,
493            which is followed by the parameter value. For example:
494        </p>
495            <pre class="programlisting">    set_data_dir /export1/db/env_data_files </pre>
496          </div>
497        </div>
498        <div class="sect2" lang="en" xml:lang="en">
499          <div class="titlepage">
500            <div>
501              <div>
502                <h3 class="title"><a id="errorsupport"></a>Error Support</h3>
503              </div>
504            </div>
505            <div></div>
506          </div>
507          <p>
508            To simplify error handling and to aid in application debugging, environments offer several useful
509            methods. 
510            
511            <span>Note that many of these
512            methods are identical to the error handling methods available for the
513            
514            
515            <span>DatabaseConfig</span>
516            
517            <span>class.</span>
518            
519            </span>
520
521            They are:
522        </p>
523          <div class="itemizedlist">
524            <ul type="disc">
525              <li>
526                <p>
527                
528                <tt class="methodname">EnvironmentConfig.setErrorStream()</tt>
529            </p>
530                <p>
531                Sets the
532                    
533                    <span>Java <tt class="classname">OutputStream</tt></span>
534                to be used for displaying error messages issued by the DB library.
535            </p>
536              </li>
537              <li>
538                <p>
539                
540                <tt class="methodname">EnvironmentConfig.setErrorHandler()</tt>
541            </p>
542                <p>
543                Defines the message handler that is called when an error message is
544                issued by DB. The error prefix and message are passed to
545                this callback. It is up to the application to display this
546                information correctly.
547            </p>
548                <p>
549                Note that the message handler must be an implementation of the
550                <tt class="classname">com.sleepycat.db.ErrorHandler</tt>
551                interface.
552            </p>
553              </li>
554              <li>
555                <p>
556                
557                <tt class="methodname">EnvironmentConfig.setErrorPrefix()</tt>
558            </p>
559                <p>
560                Sets the prefix used to for any error messages issued by the
561                DB library.
562            </p>
563              </li>
564            </ul>
565          </div>
566        </div>
567        <div class="sect2" lang="en" xml:lang="en">
568          <div class="titlepage">
569            <div>
570              <div>
571                <h3 class="title"><a id="sharedmemory"></a>Shared Memory Regions</h3>
572              </div>
573            </div>
574            <div></div>
575          </div>
576          <p>
577            The subsystems that you enable for an environment (in our case,
578            transaction, logging, locking, and the memory pool)
579            are described by one or more regions.  The regions contain all of the
580            state information that needs to be shared among threads and/or
581            processes using the environment.
582        </p>
583          <p>
584            Regions may be backed by the file system, by heap memory, or by
585            system shared memory.
586        </p>
587          <div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
588            <h3 class="title">Note</h3>
589            <p>
590                When DB dynamically obtains memory, it uses memory outside of the JVM. Normally the amount of memory
591                that DB obtains is trivial, a few bytes here and there, so you might not notice it. However, if 
592                heap or system memory is used to back your region files, then this can represent a significant amount of
593                memory being used by DB above and beyond the memory required by the JCM process. As a result, the
594                JVM process may appear to be using more memory than you told the process it could use.
595            </p>
596          </div>
597          <div class="sect3" lang="en" xml:lang="en">
598            <div class="titlepage">
599              <div>
600                <div>
601                  <h4 class="title"><a id="filebackedregions"></a>Regions Backed by Files</h4>
602                </div>
603              </div>
604              <div></div>
605            </div>
606            <p>
607           By default, shared memory regions are created as files in the environment's
608           home directory (<span class="emphasis"><em>not</em></span> the environment's data
609           directory). If it is available, the POSIX <tt class="literal">mmap</tt> 
610           interface is used to map these files into your application's
611           address space. If <tt class="literal">mmap</tt> 
612           is not available, then the UNIX <tt class="literal">shmget</tt> interfaces 
613           are used instead (again, if they are available).
614        </p>
615            <p>
616            In this default case, the region files are named
617            <tt class="literal">__db.###</tt>
618            (for example, <tt class="literal">__db.001</tt>, <tt class="literal">__db.002</tt>, 
619            and so on).
620        </p>
621          </div>
622          <div class="sect3" lang="en" xml:lang="en">
623            <div class="titlepage">
624              <div>
625                <div>
626                  <h4 class="title"><a id="heapbackedregions"></a>Regions Backed by Heap Memory</h4>
627                </div>
628              </div>
629              <div></div>
630            </div>
631            <p>
632            If heap memory is used to back your shared memory regions, 
633            the environment may only be
634            accessed by a single process, although that process may be
635            multi-threaded. In this case, the regions are managed only in
636            memory, and they are not written to the filesystem. You
637            indicate that heap memory is to be used for the region files by
638            specifying
639                
640
641                <span>
642                    <tt class="literal">true</tt> to the
643                    <tt class="methodname">EnvironmentConfig.setPrivate()</tt>
644                    method.
645                </span>
646
647        </p>
648            <p>
649            (For an example of an entirely in-memory transactional
650            application, see
651                
652                <span>
653                <a href="inmem_txnexample_java.html">Base API In-Memory Transaction Example</a>.)
654                </span>
655                
656                
657        </p>
658          </div>
659          <div class="sect3" lang="en" xml:lang="en">
660            <div class="titlepage">
661              <div>
662                <div>
663                  <h4 class="title"><a id="systembackedregions"></a>Regions Backed by System Memory</h4>
664                </div>
665              </div>
666              <div></div>
667            </div>
668            <p>
669            Finally, you can cause system memory to be used for your
670            regions instead of memory-mapped files. You do this by providing
671                
672
673                <span>
674                    <tt class="literal">true</tt> to the
675                    <tt class="methodname">EnvironmentConfig.setSystemMemory()</tt>
676                    method.
677                </span>
678        </p>
679            <p>
680            When region files are backed by system memory, DB creates a
681            single  file in the environment's home directory. This file
682            contains information necessary to identify the system shared
683            memory in use by the environment. By creating this file, DB
684            enables multiple processes to share the environment.
685        </p>
686            <p>
687            The system memory that is used is architecture-dependent. For
688            example, on systems supporting X/Open-style shared memory
689            interfaces, such as UNIX systems, the <tt class="literal">shmget(2)</tt>
690            and related System V IPC interfaces are used. 
691        
692            <span> 
693
694                Additionally, VxWorks systems use system memory. In these cases,
695                an initial segment ID must be specified by the application to
696                ensure that applications do not overwrite each other's
697                environments, so that the number of segments created does not
698                grow without bounds.  See the 
699
700                    
701                    
702                    <tt class="methodname">EnvironmentConfig.setSegmentId()</tt>
703                method for more information.
704            </span>
705        </p>
706            <p>
707            On Windows platforms, the use of system memory for the region files
708            is problematic because the operating system uses reference counting
709            to clean up shared objects in the paging file automatically. In
710            addition, the default access permissions for shared objects are
711            different from files, which may cause problems when an environment
712            is accessed by multiple processes running as different users. See
713                <a href="" target="_top">Windows notes</a>
714            or more information.
715        </p>
716          </div>
717        </div>
718        <div class="sect2" lang="en" xml:lang="en">
719          <div class="titlepage">
720            <div>
721              <div>
722                <h3 class="title"><a id="security"></a>Security Considerations</h3>
723              </div>
724            </div>
725            <div></div>
726          </div>
727          <p>
728            When using environments, there are some security considerations to
729            keep in mind:
730        </p>
731          <div class="itemizedlist">
732            <ul type="disc">
733              <li>
734                <p>
735                    Database environment permissions
736                </p>
737                <p>
738                    The directory used for the environment
739                    should have its permissions set to ensure that files in the
740                    environment are not accessible to users without appropriate
741                    permissions. Applications that add to the user's permissions
742                    (for example, UNIX <tt class="literal">setuid</tt> or
743                    <tt class="literal">setgid</tt> applications), must be
744                    carefully checked to not permit illegal use of those
745                    permissions such as general file access in the environment
746                    directory.
747                </p>
748              </li>
749              <li>
750                <p>
751                    Environment variables
752                </p>
753                <p>
754                    Setting 
755
756                    
757                    <span>
758                       <tt class="literal">true</tt> for <tt class="methodname">EnvironmentConfig.setUseEnvironment()</tt>
759                                or
760                       <tt class="methodname">EnvironmentConfig.setUseEnvironmentRoot()</tt>
761                    </span>
762
763                    so that environment variables can be used during file naming
764                    can be dangerous. Setting those flags in DB
765                    applications with additional permissions (for example, UNIX
766                    <tt class="literal">setuid</tt> or <tt class="literal">setgid</tt> 
767                    applications) could potentially allow users
768                    to read and write databases to which they would not normally
769                    have access.
770                </p>
771                <p>
772                    For example, suppose you write a DB application
773                    that runs <tt class="literal">setuid</tt>. This means that
774                    when the application runs, it does so under a
775                    userid different than that of the application's caller.
776                    This is especially problematic if the application is
777                    granting stronger privileges to a user than the user
778                    might ordinarily have.
779                </p>
780                <p>
781                    Now, if 
782                    
783                    <span>
784                       <tt class="literal">true</tt> is specified 
785                       for <tt class="methodname">EnvironmentConfig.setUseEnvironment()</tt>
786                                or
787                       <tt class="methodname">EnvironmentConfig.setUseEnvironmentRoot()</tt>,
788                    </span>
789                    
790                    
791                    then the environment that the application is
792                    using is modifiable using the
793                    <tt class="literal">DB_HOME</tt> environment variable. In
794                    this scenario, if the uid used by the application has
795                    sufficiently broad privileges, then the application's caller
796                    can read and/or write databases owned by another user
797                    simply by setting his
798                    <tt class="literal">DB_HOME</tt> environment variable to the
799                    environment used by that other user.
800                </p>
801                <p>
802                    Note that this scenario need not be malicious; the
803                    wrong environment could be used by the application
804                    simply by inadvertently specifying the wrong path to 
805                    <tt class="literal">DB_HOME</tt>.
806                </p>
807                <p>
808                    As always, you should use <tt class="literal">setuid</tt>
809                    sparingly, if at all. But if you do use
810                    <tt class="literal">setuid</tt>, then you should refrain from
811                    specifying 
812                    
813                    <span>
814                       <tt class="literal">true</tt> for <tt class="methodname">EnvironmentConfig.setUseEnvironment()</tt>
815                                or
816                       <tt class="methodname">EnvironmentConfig.setUseEnvironmentRoot()</tt>
817                    </span>
818                    for the environment open. And, of course, if you must
819                    use <tt class="literal">setuid</tt>, then make sure you use
820                    the weakest uid possible – preferably one that is
821                    used only by the application itself.
822                </p>
823              </li>
824              <li>
825                <p>
826                    File permissions
827                </p>
828                <p>
829                    By default, DB always creates database and log files readable and
830                    writable by the owner and the group (that is,
831                    <tt class="literal">S_IRUSR</tt>,
832                    <tt class="literal">S_IWUSR</tt>, <tt class="literal">S_IRGRP</tt> and
833                    <tt class="literal">S_IWGRP</tt>; or octal mode 0660 on historic
834                    UNIX systems). The group ownership of created files is based
835                    on the system and directory defaults, and is not further
836                    specified by DB.
837                </p>
838              </li>
839              <li>
840                <p>
841                    Temporary backing files
842                </p>
843                <p>
844                    If an unnamed database is created and the cache is too small
845                    to hold the database in memory, Berkeley DB will create a
846                    temporary physical file to enable it to page the database to
847                    disk as needed. In this case, environment variables such as
848                    <tt class="literal">TMPDIR</tt> may be used to specify the
849                    location of that temporary file. Although temporary backing
850                    files are created readable and writable by the owner only
851                    (<tt class="literal">S_IRUSR</tt> and <tt class="literal">S_IWUSR</tt>,
852                    or octal mode 0600 on historic UNIX systems), some
853                    filesystems may not sufficiently protect temporary files
854                    created in random directories from improper access. To be
855                    absolutely safe, applications storing sensitive data in
856                    unnamed databases should use the 
857                    
858                    
859                    <tt class="methodname">EnvironmentConfig.setTemporaryDirectory()</tt>
860                    method to specify a temporary directory with known permissions.
861                </p>
862              </li>
863            </ul>
864          </div>
865        </div>
866      </div>
867    </div>
868    <div class="navfooter">
869      <hr />
870      <table width="100%" summary="Navigation footer">
871        <tr>
872          <td width="40%" align="left"><a accesskey="p" href="perftune-intro.html">Prev</a> </td>
873          <td width="20%" align="center">
874            <a accesskey="u" href="index.html">Up</a>
875          </td>
876          <td width="40%" align="right"> <a accesskey="n" href="envopen.html">Next</a></td>
877        </tr>
878        <tr>
879          <td width="40%" align="left" valign="top">Performance Tuning </td>
880          <td width="20%" align="center">
881            <a accesskey="h" href="index.html">Home</a>
882          </td>
883          <td width="40%" align="right" valign="top"> Opening a Transactional Environment and
884            
885            Store or Database
886            
887        </td>
888        </tr>
889      </table>
890    </div>
891  </body>
892</html>
893