`

jdbc-事务

    博客分类:
  • jdbc
 
阅读更多

 

0 事务的概念:


事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。
例如:A——B转帐,对应于如下两条sql语句
  update from account set money=money+100 where name=‘b’;
  update from account set money=money-100 where name=‘a’;
数据库开启事务命令
start transaction  开启事务
Rollback  回滚事务
Commit   提交事务

 

1 事务特性:

 

a) 原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 
b) 一致性(Consistency)事务必须使数据库从一个一致性状态变换到另外一个一致性状态。eg: 用户a,b各有1000元,a给b转账500结束后,a和b的账户总额还是2000没有变更,这就是操作前和操作后的状态一致


c) 隔离性(Isolation)事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
d) 持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响    

 

2 如果不考虑事务隔离性,会导致的问题:

 

a) 脏读,(一个事务读取了另外一个事务未提交的数据) eg: 甲开启事务,给乙打钱,后给乙打电话要求发货,乙查询有钱后发货给甲,然后甲将事务回滚

 

b) 不可重复读(两次读取同一条记录,读到的结果不一致) eg: 甲余额200元,银行查询甲余额得到200,此时甲存100,银行再次查询得到结果为300,银行两次查询结果不一致,这种结果在一些特定场景出现是有问题,比如做报表前后两次得到的结果不一样

 

c) 虚读/幻读(在同一个事务内,第一次读到5条记录,第二次读到6条记录,多读出来的那条记录叫幻影数据,)

 

不可重复读和虚读/幻读的最大区别是: 前者是针对同一条记录而言,后者是针对记录个数而言(个人理解)

 

 3 数据库定义的4中事务隔离级别(不同级别来防止不同问题)

 

隔离级别 描述 问题
read uncommitted读未提交数据

允许事务读取未被其他事务提交的变更

 

脏读/不可重复读/幻读的问题都会出现

read committed读已提交数据 事务只能读取被其他事务已提交的变更记录

避免了脏读;

不可重复读/幻读会出现

repeatable read可重复读 确保事务可以多次从一个字段中读取相同数值,在这个事务持续期间,禁止其他事务对此字段进行更新

避免了脏读/不可重复读;

幻读会出现

serializable 串行化 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对此字段进行插入,更新,删除

性能低下

规避了所有问题

每一个事务操作都会锁表,单线程操作,事务提交后才能让下一个事务/线程进来操作这个表

 

 

 mysql支持以上所有隔离级别,默认的隔离级别为: repeatable read可重复读

oracle 支持2种离级别,read committed  和 serializable, 默认隔离级别为: read committed

oracle的默认事务隔离级别设置的要比mysql低。

 

mysql隔离级别查询语句:



 

 

设置mysql事务隔离级别语句:


 

 

 

 

 

4 JDBC使用事务:

 

当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句
若想关闭这种默认提交方式,让多条SQL在一个事务中执行,使用如下写法:
Connection.setAutoCommit(false);


JDBC控制事务语句
Connection.setAutoCommit(false);
Connection.rollback();
Connection.commit();

 

5 JDBC设置事务回滚点:


Savepoint sp = conn.setSavepoint();
Conn.rollback(sp);
Conn.commit();   //回滚后必须要提交

 

 

6 JDBC设置事务级别:

 

是使用Connction的setTransactionIsolation(级别)方法,具体可参看 javaseapi的Connection介绍

 

Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		Savepoint sp = null;
		try {
			conn = JdbcUtils.getConnection();
			conn.setAutoCommit(false);
			conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
			
			String sql = "select money from account where name='aaa'";
			st = conn.prepareStatement(sql);
			
			rs = st.executeQuery();
			if(rs.next()){
				System.out.println("aaa有" + rs.getDouble("money") + "钱!!!");
			}
			
			Thread.sleep(1000*20); // 在线程等待这20S内,去数据库中修改操作语句
			
			rs = st.executeQuery();
			
			if(rs.next()){ // 查询金额是否变更
				System.out.println("aaa有" + rs.getDouble("money") + "钱!!!");
			}
			
			conn.commit();
			
		}catch(Exception e){
			e.printStackTrace();
		}
		finally {
			bj.JdbcUtils.release(rs, st, conn); // 自定义工具类
		}
	}

 

 

 


 

 

  • 大小: 11.8 KB
  • 大小: 20.7 KB
分享到:
评论

相关推荐

    03-JDBC-事务及批处理.xmind

    JDBC进阶2

    transactions-jdbc-4.0.4.jar

    JAVA分布式事务atomikos atomikos jar 包 transactions-jdbc-4.0.4.jar

    taos-jdbcdriver-2.0.4.jar

    TDengine 的 JDBC 驱动实现尽可能的与关系型数据库驱动保持一致,但时序空间数据库与关系对象型数据库服务的对象和技术特征的差异导致 taos-jdbcdriver 并未完全实现 JDBC 标准规范。在使用时需要注意以下几点: ...

    JDBC专题(五)-JDBC专题-JDBC事务.docx

    3.JDBC中使用事务 3.1.JDBC使用事务范例 3.2设置事务回滚点 1.事务(Transaction)的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。 举例:需求:把大象放入冰箱 1....

    JDBC事务控制--讲述如何控制JDBC事务

    JDBC事务控制--讲述如何控制JDBC事务

    Sharding-JDBC分布式事务应用

    Sharding-JDBC分布式事务应用

    Sharding-JDBC分布式事务应用.pdf

    Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

    JDBC专题(六)-JDBC专题-事务的隔离级别.docx

    事务的概念:一个事务可以拆分为多个逻辑单元,多个逻辑单元是一个整体,要么全部成功,要么全部失败! 事务场景: 转账、发红包 1.事务的四大特性(ACID)---经典面试题 •原子性(Atomicity) 原子性是指事务是一个...

    JDBC---初学者入门

    一.JDBC原理概述(了解 能说出来就行) 二.JDBC的API (熟记于心) 三.JDBC应用步骤(熟记于心) 四.元数据(了解) ...事务(Transaction)(熟记于心) 六.JDBC2.0新特性(了解) 其中批处理必须掌握。

    mssql-jdbc-8.4.0.jre8.jar

    jdk1.8可使用的jdbc驱动... DriverManager:负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。Driver:驱动程序,会将自身加载到DriverManager中去,并处理...

    sqljdbc_8.2.2.0_chs.zip

    JDBC 通过调用其接口提供的方法, 提供了 Java 应用程序与各种数据库服务器之间的连接服务, 它支持 ANSI SQL- 92 标准, 实现了从 Java 程序内调用标准的 SQL 命令对数据库进行查询、插入、删除和更新等操作, 并...

    JDBC-JTA.rar_jdbc_jta_jta JDBC

    JDBC和JTA访问数据库和管理事务的方法实例:JDBC访问数据库的一般方法、及JTA事务管理的方法介绍。

    Spring JDBC与事务管理

    javaEE 实验三 Spring JDBC与事务管理, 一、实验目的 1、掌握Spring JDBC的配置; 2、掌握JdbcTemplae类中增删改查方法的使用; 3、了解Spring事务管理的3个核心接口; 4、了解Spring事务管理的两种方式; 5、掌握...

    JDBC事务处理机制探秘

    1、JavaBean中使用JDBC事务处理 在JDBC中怎样将多个SQL语句组合成一个事务呢?在JDBC中,打开一个连接对象Connection时,缺省是auto-commit模式,每个SQL语句都被当作一个事务,即每次执行一个语句,都会自动的得到...

    Java(JDBC)事务处理

    Java(JDBC)事务处理

    shardingsphere-jdbc-nocas-seata:分布式事务处理方案,seata分布式事务:项目Spring Cloud + ShardingSphereJDBC + nacos + seata分组事务+ fegin

    Shardingsphere-jdbc-nocas-seata用seata分布式事务处理方案分布式事务处理方案,seata分布式事务:项目Spring Cloud + ShardingSphereJDBC + nacos + seata分组事务+ fegin

    SpringJDBC注解事务.zip

    SpringJDBC注解事务.zip,SpringJDBC注解事务.zip

    JDBC事务 JTA事务 传播特性 隔离级别

    有关JDBC事务 JTA事务 传播特性 隔离级别等等

    sharding-jdbc-1.5.1:sharding-jdbc原始码解析

    分片JDBC是JDBC的扩展,提供了诸如分片,读/写拆分和BASE事务之类的分布式功能。 特征 1.分片 分布式数据库中支持的聚合功能,分组依据,排序依据和限制SQL。 支持联接(内部/外部)查询。 分片运算符= ,支持...

    JDBC的事务初探

    源代码 博文链接:https://superleo.iteye.com/blog/130876

Global site tag (gtag.js) - Google Analytics