`
aladdin_leon
  • 浏览: 118467 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

数据库事务备忘录之二

阅读更多

      上一篇提到了数据库事务的ACID特性,那么谁来保证数据库事务具有ACID呢?其实,只要向数据库系统声明一个事务,数据库系统就会自动保证事务的ACID特性的。那么下面从抽象的概念上来看看怎么声明事务:
      -----  BEGIN 事务的开始边界
      -----  COMMIT 事务的正常结束边界,提交事务,永久保存被事务更新后的数据库状态。
      -----  ROLLBACK 事务的异常结束边界,撤销事务,使数据退回到执行事务前的初始状态。
      数据库系统支持以下两种事务模式:
      ----- 自动提交模式:每个SQL语句都是一个独立的事务,当数据库系统执行完一个SQL语句后,会自动提交事务。
      ----- 手工提交事务:必须由数据库的客户端显式指定事务开始边界和结束边界。
     以MySQL为例,如果我们启动一个MySQL客户端,就会得到一个独立的数据库连接。每个数据库连接都有一个全局变量@@autocommit,表示当前的事务模式,它有两个可选值:
      ----- 0:表示手工提交模式。
      ----- 1:默认值,表示自动提交模式。
      可以通过SQL命令 SELECT @@autocommit 来查看当前的事务模式。如果想要把当前的事务模式改为手工提交模式,可以使用以下SQL命令  SET autocommit=0 来实现。
      还要多说几句,在MySQL中,数据库表分为三种类型:INNODB、BDB、MyISAM。其中前两种类型的表支持数据库事务,而MyISAM类型的表不支持事务。在使用CREATE TABLE命令创建表时默认的类型为MyISAM,如果希望更改的话可以通过如下DLL来进行:
       ALTER TABLE table_name TYPE=INNODB;
       如果希望在创建时就指定表的类型,可以通过以下DLL来进行:
       CREATE TABLE table_name(
           .....
           .....
       ) TYPE=INNODB;
      好了,下面我们来看几个在实践应用程序中声明事务的模板。
   
1.在MySQL.exe客户端程序中声明事务
      我们以一条插入语句为例,当然如果是自动提交模式的话,每一个SQL语句都是一个单独的事务,我们直接运行以下语句就可以了:
          mysql>INSERT INTO qq_account VALUES('leon', 1000);
     下面我们看看在手动模式下的命令:
          mysql>SET autocommit=0;
          mysql>BEGIN;
          mysql>INSERT INTO qq_account VALUES('leon', 1000);
          mysql>COMMIT;
      这样一个事务就完成了,下面我们看一看如何撤销一个事务,很简单也许你已经猜到了吧
          mysql>BEGIN;
          mysql>INSERT INTO qq_account VALUES('leon', 1000);
          mysql>ROLLBACK;

2.在JDBC API中声明事务
      没有什么难度,我们直接来看看代码:

  1. Connection con = null;   
  2. Statement stmt = null;   
  3. try {   
  4.    con = DriverManager.getConnection(dbUrl,dbUser,dbPwd);   
  5.    //设置手工提交事务模式   
  6.    con.setAutoCommit(false);   
  7.    stmt = con.createStatement();   
  8.    stmt.executeUpdate("INSERT INTO qq_account VALUES ('leon', 1000)");   
  9.    //提交事务   
  10.    con.commit();   
  11. catch(SQLException e) {   
  12.    if(con != null) {   
  13.       try {   
  14.          //操作不成功则撤销事务   
  15.          con.rollback();         
  16.       } catch(SQLException e) {   
  17.          ......   
  18.       }   
  19.    }   
  20.    ......   
  21. finally {   
  22.    if(con != null) {   
  23.       try{   
  24.          if(stmt != null) {   
  25.             try {    
  26.                stmt.close();   
  27.             } catch(SQLException e) {   
  28.                ......   
  29.             }   
  30.          }   
  31.          con.close();   
  32.       } catch(SQLException e) {   
  33.          ......   
  34.       }    
  35.    }   
  36. }   

      没有什么可再说的了,代码详细得已经像是一篇技术文章了,需要注意的是对于新建的Connection实例来说,在默认的情况下采用自动提交的事务模式,通过方法 con.setAutoCommit(false)来设置手动提交模式。

3.在Hibernate API中声明事务
       Hibernate封装了JDBC API和JTA API,尽管应用程序可以绕过Hibernate API,直接通过JDBC API和JTA API来声明事务,但是这不利于跨平台的开发,下面我们只考虑Hibernate API的实现:

  1. Configuration config = new Configuration().configure();   
  2. SessionFactory factory = config.buildSessionFactory();   
  3. Session session = factory.openSession();   
  4. Transation tx = null;   
  5. try {   
  6.    //开始一个事务   
  7.    tx = session.beginTransaction();   
  8.    Account account = new Account("leon",1000);   
  9.    session.save(account);   
  10.    //提交事务   
  11.    tx.commit();   
  12. catch(HibernateException e) {   
  13.     if(tx != null) {   
  14.        try {   
  15.           //操作不成功则撤销事务   
  16.           tx.rollback();   
  17.        } catch(HibernateException e) {   
  18.           ......   
  19.        }   
  20.     }   
  21.     ......   
  22. finally {   
  23.     if(session != null) {   
  24.        try {   
  25.           session.close();   
  26.        } catch(HibernateException e) {   
  27.           ......   
  28.        }   
  29.     }   
  30. }  

      上面的代码和JDBC API很相像,值得注意的是,在任何时候,一个Session只允许有一个未提交的事务。以下代码对于一个Session同时声明了两个未提交的事务,这是不允许的:
          tx1 = session.beginTransaction();
          tx2 = session.beginTransaction();
                 ......
          tx1.commit();
          tx2.commit();
      好了,今天就写到这里吧,顺便唠叨一句,看到新的一期《程序员》里面的调查71%的程序员通过写技术BLOG提升自己的技术水平,坚定了自己作技术BLOG的信心,每天都记录下自己的学习轨迹,让自己更加的充实...  

分享到:
评论

相关推荐

    C#备忘录数据库代码

    - 对于多个操作需要一起成功或一起失败的情况,可以使用数据库事务来确保数据一致性。 10. 性能优化: - 通过合理设计数据库结构、索引和查询语句,以及适当使用缓存和批处理,可以提高应用程序的性能。 综上所...

    oracle 数据库工作备忘录

    Oracle数据库工作备忘录 Oracle数据库是全球广泛使用的大型企业级关系型数据库管理系统,由甲骨文公司(Oracle Corporation)开发。它以其高效、稳定和强大的功能著称,被广泛应用于金融、电信、政府和各类企业的...

    android 备忘录 数据库存储到本地 定时提醒

    本文将详细讲解如何实现“android 备忘录 数据库存储到本地 定时提醒”的核心知识点。 首先,我们关注的是数据存储。在Android中,本地数据存储通常有多种方式,如Shared Preferences、Internal Storage、External ...

    c# 备忘录源码(含数据库)

    《C#备忘录源码解析与数据库应用》 C#是一种面向对象的编程语言,由微软公司开发,广泛应用于Windows平台的软件开发。在这个“C# 备忘录源码(含数据库)”项目中,我们将深入探讨如何利用C#实现一个功能完备的备忘...

    Android课程设计--便捷备忘录

    2. **EditActivity.java** - 编辑备忘录的Activity,用户可以输入新备忘录或者修改已有的。 3. **DatabaseHelper.java** - SQLite数据库帮助类,负责数据库的创建、升级以及数据操作。 4. **ReminderReceiver.java**...

    备忘录,免费桌面备忘录,M备忘

    总的来说,"备忘录,免费桌面备忘录,M备忘"是一款结合了MFC的强大功能和ACCESS数据库的高效数据管理的桌面应用。它以其轻巧的体积、免费的特性以及可定制的源代码,为用户提供了便捷、可靠的备忘解决方案。通过这款...

    数据库Sqlite的备忘录

    7. 数据库事务: SQLite支持事务处理,可以确保数据的一致性和完整性。`BEGIN`, `COMMIT` 和 `ROLLBACK` 语句用于控制事务。例如,当执行一系列操作时,可以包裹在事务中,以确保它们要么全部成功,要么全部回滚: ...

    java+Mysql开发的备忘录系统

    这个系统的主要目标是提供一套便捷的工具,让用户能够轻松地管理他们的日常事务,包括创建、编辑、查找和删除备忘录。同时,系统还集成了对Windows系统内建小工具如记事本和计算器的访问,以增强用户体验。 首先,...

    android 备忘录小程序

    - 数据存储:备忘录的数据通常存储在SQLite数据库中,每个备忘录条目是一个记录,包含文字和图片的二进制数据。图片可能以Blob形式存储,或者通过URI引用外部文件系统中的图像。 - UI组件:应用可能使用...

    C#编写的备忘录

    本文将详细介绍一款由C#语言编写的Winform安装程序,它是一个功能完备的备忘录应用,能够帮助用户轻松管理日常事务,设定提醒,确保重要事项不会被遗漏。 C#,全称CSharp,是微软公司推出的一种面向对象的编程语言...

    02 as备忘录程序+源码+APK+数据库+移动终端期末大作业项目试验+备忘录大作业2024+JIE图

    该备忘录程序是一款简洁实用的应用,旨在帮助用户高效记录和管理日常事务。用户可以轻松创建、编辑和删除备忘录,支持设置提醒功能,以确保不会错过重要事项。应用界面直观,操作流畅,用户可以通过标签和分类功能对...

    手机备忘录程序

    【手机备忘录程序】是一种常见且实用的智能手机应用程序,主要功能是帮助用户记录日常生活、工作中的重要事项或想法,确保不会遗忘待办任务。它通常具有简洁的用户界面和高效的提醒机制,使得用户可以方便地创建、...

    桌面widget备忘录

    6. **SQLite数据库**: 对于支持多个备忘录,开发者可能需要建立一个本地SQLite数据库来存储各个备忘录条目,便于快速检索和编辑。 7. **UI设计与交互**: 设计简洁易用的备忘录小部件界面至关重要。这包括字体、颜色...

    备忘录系统

    【备忘录系统】是一个由个人开发的软件应用,它提供了创建、管理和删除备忘录的基本功能,旨在帮助用户方便地记录和跟踪日常事务。这个系统可能是用VC(Visual C++)作为编程语言,结合SQL(Structured Query ...

    企业备忘录管理系统

    2. **备忘录创建与编辑**:用户可以创建新的备忘录,输入标题、内容、优先级、截止日期等信息,并支持后期编辑。 3. **分类与标签管理**:备忘录可以按照类别或者标签进行归档,方便用户查找和管理。 4. **搜索与...

    SQLite的小例子--备忘录

    2. 创建表:备忘录应用的核心是一个“备忘录”表,我们需要用SQL语句创建它。表结构可能包括ID(主键)、标题、内容和创建时间等字段。例如,创建表的SQL语句可能是: ```sql CREATE TABLE Memo ( ID INTEGER ...

    个人备忘录源码

    【个人备忘录源码】是一个专为个人设计的备忘录应用程序的源代码,它提供了记录、管理和检索日常事务的功能。源码的编写语言可能是Delphi,这是一款基于Object Pascal的集成开发环境,以其高效的编译器和丰富的组件...

    一个简单的备忘录

    【标题】:“一个简单的备忘录” 在移动设备上,备忘录应用程序是日常生活中非常实用的工具,用于记录各种待办事项、想法或者提醒。本项目提供了一个详细的安卓备忘录源码实现,涵盖了核心功能如添加、删除、修改...

    android 应用 源代码——备忘录

    2. **数据存储**:备忘录的数据通常保存在本地,可以使用SQLite数据库存储。SQLite是一个轻量级的关系型数据库,适用于移动设备。开发者需要创建数据库表,定义字段,以及相应的增删查改(CRUD)操作。 3. **...

Global site tag (gtag.js) - Google Analytics