`
coolxing
  • 浏览: 874281 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
9a45b66b-c585-3a35-8680-2e466b75e3f8
Java Concurre...
浏览量:97307
社区版块
存档分类
最新评论

事务入门

    博客分类:
  • JDBC
阅读更多

[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.] 

 

1. 事务入门. 事务是一组操作的集合, 这些操作要么一起执行成功, 要么一起执行失败. JDBC和Mysql数据的事务命令如下:

Connection.setAutoCommit(false)---start transaction

Connection.rollback()-------------------rollback

Connection.commit()--------------------commit

Connection.setSavePoint()用于设置回滚点, 该方法返回一个SavePoint对象. 如果调用Connection.rollback(SavePoint sp)方法则回滚至sp锁代表的回滚点.

如果一个线程尚未开启事务, 则数据库将自动提交所有修改. 

线程开启事务之后, 执行了提交或者回滚时事务结束; 如果断开连接时事务既没有提交也没有回滚, 数据库将自动放弃所有修改(即自动回滚至事务开启处).

例子:

Java代码 
  1. /* 
  2.  * create table transaction (id int primary key auto_increment, name varchar(40), money float); 
  3.  * insert into transaction(name, money) values('coolxing', 5009.9); 
  4.  * insert into transaction(name, money) values('min', 6666.6); 
  5.  * insert into transaction(name, money) values('yong', 3333.1); 
  6.  */  
  7. public class DbTransaction {  
  8.     @Test  
  9.     public void transactionWithNoexception() {  
  10.         Connection conn = null;  
  11.         PreparedStatement st = null;  
  12.           
  13.         try {  
  14.             conn = JdbcUtils.getConnection();  
  15.             // 开启事务. 事务开启之后, 所有针对数据库的操作都需要进行提交, 否则在断开连接时服务器将自动回滚.  
  16.             conn.setAutoCommit(false);  
  17.               
  18.             String sql = "update transaction set money=money+1000 where id=1";  
  19.             st = conn.prepareStatement(sql);  
  20.             st.executeUpdate();  
  21.               
  22.             sql = "update transaction set money=money-1000 where id=2";  
  23.             st = conn.prepareStatement(sql);  
  24.             st.executeUpdate();  
  25.               
  26.             sql = "select * from transaction";  
  27.             st = conn.prepareStatement(sql);  
  28.             ResultSet rs = st.executeQuery();  
  29.             while(rs.next() ) {  
  30.                 System.out.println("--------------------");  
  31.                 System.out.println(rs.getInt("id"));  
  32.                 System.out.println(rs.getString("name"));  
  33.                 System.out.println(rs.getFloat("money"));  
  34.             }  
  35.               
  36.             conn.commit();  
  37.         } catch (Exception e) {  
  38.             e.printStackTrace();  
  39.             if (conn != null) {  
  40.                 try {  
  41.                     conn.rollback();  
  42.                 } catch (SQLException e1) {  
  43.                     e1.printStackTrace();  
  44.                 }  
  45.             }  
  46.         } finally {  
  47.             JdbcUtils.release(null, st, conn);  
  48.         }  
  49.     }  
  50. }  

 

2. 事务的4大特性ACID.

a. 原子性(Atomicity): 事务是一个不可分割的执行单位, 事务中的操作要么全部成功, 要么全部失败.

b. 一致性(Consistency): 事务前后数据的完整性需要保持一致. 例如在一个转账事务中, 所有账户的总金额在事务执行前后必须相同.

c. 隔离性(Isolation): 事务的隔离性定义多个线程并发访问数据库时, 系统所采取的隔离措施. 详见后面的分析.

d. 持久性(Durability): 指事务一旦提交成功, 该事务对数据库中的数据所作的修改永久有效, 不可因外部意外情况对其有任何影响.

 

3. 事务的隔离性主要为了避免以下情况的发生:

a. 脏读. 指的是A事务读取了其他事务尚未提交的修改.

b. 不可重复读. 指的是A事务多次读取某行中的数据, 如果其他事务在A事务的读取间隔期间提交了对该行数据的修改, 而导致A事务多次读取的结果不同.

c. 虚读. 指的是A事务读取到了其他事务插入的数据.

 

4. 事务的隔离级别. sql标准定义了四种隔离级别:

a. read uncommitted: 最低级别, 无法避免脏读, 不可重复读, 虚读等情况的发生.

b. read committed: 可以避免脏读的发生, 但不能避免不可重复读和虚读的发生.

c. repeatable read: 可以避免脏读和不可重复读的发生, 但不能避免虚读的发生. 处于该级别的事务会对数据库中已有记录加锁, 使得其他事务无法提交对已有记录的修改, 但允许插入新的数据.

d. serializable: 可以避免以上所有情况的发生. 处于该级别的事务会对整个数据库加锁, 使得其他事务无法提交对该数据库的任何修改. 此时相当于单线程操作.

Mysql支持以上4种隔离级别, 其默认的隔离级别为repeatable read. set transaction isolation level语句可以更改当前事务的隔离级别, 如set transaction isolation level read committed语句将当前事务的隔离级别设置为read committed. select @@tx_isolation语句用于获取当前事务的隔离级别. 而Oracle只支持read committed和serializable级别. 

实际开发时, 需要根据项目需求选择不同的隔离级别. 尤其是不可重复读和虚读, 在某些应用场景下并非是需要避免的错误, 而是完全合法的. 

隔离级别越高, 数据库的性能就越差.

检验事务的隔离级别时, 需要创建多个"已开启事务"的线程.

 

2
3
分享到:
评论
3 楼 nneverwei 2011-11-14  
不错哈,讲的挺清晰的
2 楼 Technoboy 2011-11-14  
看一下《java transaction》
1 楼 xiaokai1012 2011-11-14  
问问飒飒飒飒

相关推荐

    基于框架的Web开发-spring事务入门一个转账的例子.doc

    【Spring 事务管理入门——转账案例详解】 在Web开发中,Spring框架的事务管理是确保数据一致性的重要工具。本文将通过一个简单的转账案例来讲解Spring事务管理的基本概念和使用。 ### 事务的理解 事务是数据库...

    分布式事务入门GitChat问题实录解答

    分布式事务是现代计算机系统中处理跨多个服务或数据源事务的一组复杂的概念和技术。为了确保这些跨多个数据库或服务的事务的原子性、一致性、隔离性和持久性(ACID属性),IT业界发展了多种技术。在分布式事务的上下...

    分布式事务入门

    分布式事务是现代软件系统中处理大规模并发操作的关键技术,尤其在大数据、云计算和微服务架构背景下,其重要性不言而喻。本教程将带你深入理解分布式事务的基础知识,并通过具体的代码示例和完整的文档,让你能够...

    SQL Server事务基本使用方法

    ### SQL Server事务基本使用方法详解 #### 一、事务的概念及使用 事务(Transaction)是数据库操作中的一个重要概念,尤其在SQL Server中,它是保证数据完整性和一致性的重要机制。事务被视为一系列操作的集合,...

    深度解读分布式事务Seata入门到实践培训视频.zip

    1-分布式事务的介绍 2-扁平事务的演示 3-分布式事务演示 4-分布式事务理论之布鲁尔定理 5-分布式事务理论之Base理论 6-两阶段提交模型成功的流程 7-两阶段提交模型失败的流程 8-理论模型和解决思想之间的关系 9-强...

    URTracker事务跟踪系统入门

    下面将详细介绍如何入门URTracker。 首先,你需要下载并安装URTracker。这包括安装IIS(互联网信息服务)、.Net Framework 2.0、SQL Server数据库以及URTracker本身。安装顺序按照上述顺序进行,确保所有组件都正确...

    jdbc入门、分页以及事务

    **JDBC入门** ...以上是对JDBC入门、分页和事务的基本介绍。理解并熟练掌握这些概念对于开发与数据库交互的Java应用至关重要。在实际开发中,还需要根据具体数据库的特性和业务需求进行适当的优化和调整。

    spring声明式事务管理_入门

    spring声明式事务管理_入门

    spring cloud事务从入门到精通

    2数据库事务的介绍 3mysq|事务讲解 4mysq|-JDBC事务讲解1 5mysqI-JDBC事务讲解2 6搭建一个spring-boot项目 7idea插件easycode 8spring-boot标签事务 9spring-boot jms介绍 10spring-boot jta单数据源事务实例 11...

    分布式事务思想和分布式系统入门.txt

    3 SOA分布式事务解决方案 3.1 基于XA协议的两阶段提交方案 交易中间件与数据库通过 XA 接口规范,使用两阶段提交来完成一个全局事务, XA 规范的基础是两阶段提交协议。 第一阶段是表决阶段,所有参与者都将本事务...

    cics快速入门快速入门快速入门

    ### CICS 快速入门概述 CICS(Customer Information Control System)是IBM开发的一种交易处理系统,主要用于支持大型主机上的业务应用。CICS 提供了一套完整的解决方案来管理交易处理环境中的数据访问、事务处理和...

    2023深度解读分布式事务Seata课-视频教程网盘链接提取码下载 .txt

    本课程将深入探讨分布式事务管理框架Seata的核心概念和实际应用。学员将了解Seata在微服务架构中的作用、原理及实践,包括分布式事务、一致性、可靠性等方面的重要知识点。 视频大小:16.6G

    MyBatis入门到精通

    这篇“MyBatis入门到精通”的学习资料是针对初学者设计的,旨在帮助新手快速掌握MyBatis的基本用法和高级特性。 1. **MyBatis简介** MyBatis是由Clinton Begin创建的开源项目,它是一个基于Java的持久层框架,消除...

    微服务架构的分布式事务控制及解决方案视频教程

    最全分布式事务视频课程详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 视频课程大纲: 1.事务基本概念讲解(本地、分布式) 2.分布式事务理论(CAP、BASE) 3.分布式事务解决方案之2PC(xa、...

    storm入门.pdf

    Storm是一个分布式实时计算系统,能够有效地处理大量数据流。它由Twitter公司开发,最初的目的是...通过阅读和学习Storm入门资料,即使是对大数据分析领域不熟悉的读者,也能快速入门并掌握Storm的基础知识和开发技能。

    spring入门代码项目

    通过这个入门项目,你将逐步理解Spring的核心机制,包括依赖注入、面向切面编程、数据库操作以及事务管理。这将为你后续深入学习Spring MVC、Spring Boot、Spring Data等高级特性和实践打下坚实的基础。记得结合项目...

    若依框架分布式事务配置和项目启动手册

    快速了解文档则提供了快速入门的教程,包括创建新项目、编写基本的CRUD操作、设置权限等,使开发者能迅速上手开发。 总结,若依框架的分布式事务配置和项目启动是其核心能力之一。理解并熟练掌握这些知识,可以有效...

    某果学院!微服务架构的分布式事务解决方案!百度云,百度网盘!!!

    这样的架构设计带来了更好的可扩展性、容错性和灵活性,但同时也引入了一个关键挑战:如何处理分布式事务。 分布式事务是在分布式系统中保证数据一致性的重要手段。在微服务架构下,由于多个服务之间可能存在数据...

Global site tag (gtag.js) - Google Analytics