<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

    transaction在數(shù)據(jù)庫編程中是一個重要的概念,這樣做可以控制對數(shù)據(jù)庫操作的事務提交。
    但是要想在程序中實現(xiàn)事務,要求數(shù)據(jù)庫本身支持事務。
    現(xiàn)在的關系型數(shù)據(jù)庫,我們日常使用的mysql,oracle等等都支持事務,有的是安裝后直接就支持,有的需要做一些設置。
    這篇文章是針對mysql的,講述從數(shù)據(jù)庫安裝,設置,一直到sql語句,甚至到java程序中,如何實現(xiàn)transaction。
    1.安裝
    要想在mysql的表中支持transaction,必須要求是innodb表。普通表使用的autocommit模式,會自動提交每一條sql語句,不能算是transaction吧。
    安裝時要指定mysql支持innodb,./configure --with-innodb。

    2.配置
    安裝后,可以對innodb做一些配置,在my.cnf或my.ini中的[mysqld]段。
    #存儲目錄,如果不指定默認為安裝的data目錄,為空時以innodb_data_file_path指定路徑為準
    innodb_data_home_dir =
    #數(shù)據(jù)文件名及大小,默認為ibdata1,10m大小。autoextend可以自增,max:2000M文件最大2g,因為有的硬盤有2g文件大小限制。
    innodb_data_file_path = ibdata1:2000M;ibdata2:2000M:autoextend:max:2000M
    # 設置緩沖池大小
    set-variable = innodb_buffer_pool_size=70M
    set-variable = innodb_additional_mem_pool_size=10M
    #設置日志文件路徑,默認在date目錄下,名稱為ib_logfile...
    innodb_log_group_home_dir =
    #設置日志文件數(shù)目,默認為3
    set-variable = innodb_log_files_in_group=3
    # 設置日志文件大小
    set-variable = innodb_log_file_size=10M
    # 設置日志緩沖大小
    set-variable = innodb_log_buffer_size=8M
    # 任何事務提交前寫入日志,方便故障診斷,請設為1。如果丟失最近的幾個事務影響不大的話,設置為0(默認值)。
    innodb_flush_log_at_trx_commit=1
    #設置超時時間
    set-variable = innodb_lock_wait_timeout=50

    注意:innodb不會自動生成目錄,上面所有指定目錄要手工生成。默認不用。

    完整的配置參數(shù)如下表(下表引自http://man.chinaunix.net/database/mysql/inonodb_zh/2.htm#InnoDB_start):

     

    innodb_data_home_dir

    這是InnoDB表的目錄共用設置。如果沒有在 my.cnf 進行設置,InnoDB 將使用MySQLdatadir 目錄為缺省目錄。如果設定一個空字串,可以在 innodb_data_file_path 中設定絕對路徑。

    innodb_data_file_path

    單獨指定數(shù)據(jù)文件的路徑與大小。數(shù)據(jù)文件的完整路徑由 innodb_data_home_dir 與這里所設定值的組合。 文件大小以 MB 單位指定。因此在文件大小指定后必有“M” InnoDB 也支持縮寫“G” 1G = 1024M。從 3.23.44 開始,在那些支持大文件的操作系統(tǒng)上可以設置數(shù)據(jù)文件大小大于 4 GB。而在另一些操作系統(tǒng)上數(shù)據(jù)文件必須小于 2 GB。數(shù)據(jù)文件大小總和至少要達到 10 MB。在 MySQL-3.23 中這個參數(shù)必須在 my.cnf 中明確指定。在 MySQL-4.0.2 以及更新版本中則不需如此,系統(tǒng)會默認在 MySQL datadir 目錄下創(chuàng)建一個 16 MB 自擴充(auto-extending)的數(shù)據(jù)文件 ibdata1你同樣可以使用一個 原生磁盤分區(qū)(RAW raw disk partitions(raw devices)) 作為數(shù)據(jù)文件, 如何在 my.cnf 中詳細指定它們請查看第 12.1 節(jié)。

    innodb_mirrored_log_groups

    為了保護數(shù)據(jù)而設置的日志文件組的拷貝數(shù)目,默認設置為 1。在 my.cnf 中以數(shù)字格式設置。

    innodb_log_group_home_dir

    InnoDB 日志文件的路徑。必須與 innodb_log_arch_dir 設置相同值。 如果沒有明確指定將默認在 MySQL datadir 目錄下建立兩個 5 MB 大小的 ib_logfile... 文件。

    innodb_log_files_in_group

    日志組中的日志文件數(shù)目。InnoDB 以環(huán)型方式(circular fashion)寫入文件。數(shù)值 3 被推薦使用。在 my.cnf 中以數(shù)字格式設置。

    innodb_log_file_size

    日志組中的每個日志文件的大小(單位 MB)。如果 n 是日志組中日志文件的數(shù)目,那么理想的數(shù)值為 1M 至下面設置的緩沖池(buffer pool)大小的 1/n。較大的值,可以減少刷新緩沖池的次數(shù),從而減少磁盤 I/O。但是大的日志文件意味著在崩潰時需要更長的時間來恢復數(shù)據(jù)。 日志文件總和必須小于 2 GB3.23.55 4.0.9 以上為小于 4 GB。在 my.cnf 中以數(shù)字格式設置。

    innodb_log_buffer_size

    InnoDB 將日志寫入日志磁盤文件前的緩沖大小。理想值為 1M 8M。大的日志緩沖允許事務運行時不需要將日志保存入磁盤而只到事務被提交(commit)。 因此,如果有大的事務處理,設置大的日志緩沖可以減少磁盤I/O。 在 my.cnf 中以數(shù)字格式設置。

    innodb_flush_log_at_trx_commit

    通常設置為 1,意味著在事務提交前日志已被寫入磁盤, 事務可以運行更長以及服務崩潰后的修復能力。如果你愿意減弱這個安全,或你運行的是比較小的事務處理,可以將它設置為 0 ,以減少寫日志文件的磁盤 I/O。這個選項默認設置為 0

    innodb_log_arch_dir

    The directory where fully written log files would be archived if we used log archiving. 這里設置的參數(shù)必須與 innodb_log_group_home_dir 相同。 從 4.0.6 開始,可以忽略這個參數(shù)。

    innodb_log_archive

    這個值通常設為 0。 既然從備份中恢復(recovery)適合于 MySQL 使用它自己的 log files,因而通常不再需要 archive InnoDB log files。這個選項默認設置為 0

    innodb_buffer_pool_size

    InnoDB 用來高速緩沖數(shù)據(jù)和索引內存緩沖大小。 更大的設置可以使訪問數(shù)據(jù)時減少磁盤 I/O。在一個專用的數(shù)據(jù)庫服務器上可以將它設置為物理內存的 80 %。 不要將它設置太大,因為物理內存的使用競爭可能會影響操作系統(tǒng)的頁面調用。在 my.cnf 中以數(shù)字格式設置。

    innodb_additional_mem_pool_size

    InnoDB 用來存儲數(shù)據(jù)字典(data dictionary)信息和其它內部數(shù)據(jù)結構(internal data structures)的存儲器組合(memory pool)大小。理想的值為 2M,如果有更多的表你就需要在這里重新分配。如果 InnoDB 用盡這個池中的所有內存,它將從操作系統(tǒng)中分配內存,并將錯誤信息寫入 MySQL 的錯誤日志中。在 my.cnf 中以數(shù)字格式設置。

    innodb_file_io_threads

    InnoDB 中的文件 I/O 線程。 通常設置為 4,但是在 Windows 下可以設定一個更大的值以提高磁盤 I/O。在 my.cnf 中以數(shù)字格式設置。

    innodb_lock_wait_timeout

    在回滾(rooled back)之前,InnoDB 事務將等待超時的時間(單位 秒)InnoDB 會自動檢查自身在鎖定表與事務回滾時的事務死鎖。如果使用 LOCK TABLES 命令,或在同一個事務中使用其它事務安全型表處理器(transaction safe table handlers than InnoDB),那么可能會發(fā)生一個 InnoDB 無法注意到的死鎖。在這種情況下超時將用來解決這個問題。這個參數(shù)的默認值為 50 秒。在 my.cnf 中以數(shù)字格式設置。

    innodb_flush_method

    這個參數(shù)僅僅與 Unix 相關。這個參數(shù)默認值為 fdatasync。 另一個設置項為 O_DSYNC。這僅僅影響日志文件的轉儲,在 Unix 下以 fsync 轉儲數(shù)據(jù)。InnoDB 版本從 3.23.40b 開始,在 Unix 下指定 fdatasync 為使用 fsync 方式、指定 O_DSYNC 為使用 O_SYNC 方式。由于這在某些 Unix 環(huán)境下還有些問題所以在 'data' versions 并沒有被使用。

    innodb_force_recovery

    警告:此參數(shù)只能在你希望從一個被損壞的數(shù)據(jù)庫中轉儲(dump)數(shù)據(jù)的緊急情況下使用! 可能設置的值范圍為 1 - 6。查看下面的章節(jié) 'Forcing recovery' 以了解這個參數(shù)的具體含義。參數(shù)設置大于 0 的值代表著 InnoDB 防止用戶修改數(shù)據(jù)的安全度。從 3.23.44 開始,這個參數(shù)可用。在 my.cnf 中以數(shù)字格式設置。

    innodb_fast_shutdown

    InnoDB 缺少在關閉之前清空插入緩沖。這個操作可能需要幾分鐘,在極端的情況下可以需要幾個小時。如果這個參數(shù)據(jù)設置為 1 InnoDB 將跳過這個過程而直接關閉。從 3.23.44 4.0.1 開始,此參數(shù)可用。從 3.23.50 開始,此參數(shù)的默認值為 1

    innodb_thread_concurrency

    InnoDB 會試圖將 InnoDB 服務的使用的操作系統(tǒng)進程小于或等于這里所設定的數(shù)值。此參數(shù)默認值為 8。如果計算機系統(tǒng)性能較低或 innodb_monitor 顯示有很多線程等侍信號,應該將這個值設小一點。如果你的計算機系統(tǒng)有很我的處理器與磁盤系統(tǒng),則可以將這個值設高一點以充分利用你的系統(tǒng)資源。建議設值為處理器數(shù)目+ 磁盤數(shù)目。 從 3.23.44 4.0.1 開始,此參數(shù)可用。在 my.cnf 中以數(shù)字格式設置。

    innodb還需要使用二進制日志文件:

    log-bin指定二進制文件名稱,不指定默認生成。
    log-bin-index 可以指定索引文件。
    使用 binlog-do-db可以指定記錄的數(shù)據(jù)庫。
    使用 binlog-ignore-db可以指定不記錄的數(shù)據(jù)庫。
    注意的是: binlog-do-db 和binlog-ignore-db 一次只指定一個數(shù)據(jù)庫,指定多個數(shù)據(jù)庫需要多個語句。而且,MySQL會將所有的數(shù)據(jù)庫名稱改成小寫, 在指定數(shù)據(jù)庫時必須全部使用小寫名字,否則不會起作用。

    3.添加表
    CREATE TABLE user (id INT NOT NULL AUTO_INCREMENT,PRIMARY KEY,fname VARCHAR(15),sname VARCHAR(20),sex VARCHAR(6),age VARCHAR(3)) TYPE=INNODB;
    記得后面的TYPE=INNODB。

    4.sql語句的transaction實現(xiàn)
    兩種方式:
    如果SET AUTOCOMMIT=0;也就是關閉了自動提交,那么任何commit或rallback語句都可以觸發(fā)事務提交。
    比如:
     mysql> SET AUTOCOMMIT=0;
     Query OK, 0 rows affected (0.00 sec)
     
     mysql> INSERT INTO user(fname,sname) VALUES ('Max','Ma');
     Query OK, 1 row affected (0.00 sec)

     mysql> INSERT INTO user(fname,sname) VALUES ('Sky','Sun');
     Query OK, 1 row affected (0.00 sec)
     
     mysql> COMMIT;
     Query OK, 0 rows affected (0.00 sec)
    這樣事務就算提交了。
    如果SET AUTOCOMMIT=1;也就是開啟了自動提交(默認值),那么必須要以begin或者START TRANSACTION聲明事務的開始,然后再以commit或rallback語句都可以觸發(fā)事務提交。
    比如:
     mysql> SET AUTOCOMMIT=1;
     Query OK, 0 rows affected (0.00 sec)

     mysql> BEGIN;
     Query OK, 0 rows affected (0.00 sec)
     
     mysql> INSERT INTO user(fname,sname) VALUES ('Max','Ma');
     Query OK, 1 row affected (0.00 sec)

     mysql> INSERT INTO user(fname,sname) VALUES ('Sky','Sun');
     Query OK, 1 row affected (0.00 sec)
     
     mysql> COMMIT;
     Query OK, 0 rows affected (0.00 sec)

    像其他關系型數(shù)據(jù)庫一樣,也可以使用存儲過程(procedure)來封裝事務。

    5.java程序開發(fā)中的實現(xiàn)。
    涉及到程序開發(fā)實現(xiàn)方法就多了。
    一.自己寫方法把mysql的底層transaction命令封裝。我感覺程序開發(fā)中應該盡量避免和底層數(shù)據(jù)庫的過多交互,我沒有實現(xiàn)它。
    有人實現(xiàn)了,下面是他實現(xiàn)的一個例子網(wǎng)址:http://dlog.cn/html/diary/showlog.vm?sid=7&log_id=2516
    二.java的jdbc開發(fā)包包含了操作transaction的方法,在java.sql.connection接口里。
    使用他的好處是可以和多種類型數(shù)據(jù)庫交互。
    三.hibernate等ORM框架工具。
    hibernate 中也封狀了對transaction的操作,在org.hibernate.Session類中,使用beginTransaction()方法開啟 transaction;使用getTransaction().commit()提交transaction;使用getTransaction(). rollback()方法回滾transaciton。
    四.這是我常用的一種方法,把hibernate的session的方法封裝或者實現(xiàn)jdbc的connection的接口。



    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1481131

    posted on 2007-04-06 13:04 蘆葦 閱讀(7480) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫
    主站蜘蛛池模板: 亚洲精品成人无限看| 亚洲国产精品激情在线观看| 亚洲av无码精品网站| j8又粗又长又硬又爽免费视频| 国产又长又粗又爽免费视频| 亚洲一卡一卡二新区无人区 | 日本免费人成网ww555在线| 日韩亚洲精品福利| 一级做a爰片性色毛片免费网站| 亚洲国产V高清在线观看| 久久成人永久免费播放| 久久99亚洲综合精品首页 | 在线看片v免费观看视频777| 亚洲av无码国产综合专区| 国产妇乱子伦视频免费| 亚洲中文字幕久久精品无码A| 免费看片A级毛片免费看| 国产99久久亚洲综合精品| 亚洲午夜精品久久久久久浪潮 | 久久嫩草影院免费看夜色| 亚洲精品亚洲人成人网| 久久精品人成免费| 亚洲a视频在线观看| 日本一道综合久久aⅴ免费| 久青草国产免费观看| 亚洲AV电影院在线观看| 日韩精品无码区免费专区| 黄色一级视频免费观看| 亚洲色爱图小说专区| 曰批全过程免费视频播放网站| 亚洲欧美国产日韩av野草社区| 久久久久亚洲爆乳少妇无| 最近中文字幕国语免费完整| 精品国产成人亚洲午夜福利| 亚洲男人在线无码视频| 99re在线免费视频| 色欲aⅴ亚洲情无码AV| 亚洲Av永久无码精品三区在线| 毛片a级毛片免费播放100| 韩国免费A级毛片久久| 亚洲免费一级视频|