`

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
分享到:
评论

相关推荐

    shardingsphere-jdbc-4.1.1依赖包,shardingsphere-jdbc-4.1.1-lib

    在分布式环境下,ShardingSphere-JDBC提供了XATransaction、Seata AT和Saga等分布式事务解决方案,确保了跨库事务的一致性和原子性。这些方案能够应对复杂的业务逻辑,保证数据的完整性和一致性。 4. **数据加密...

    dbf-jdbc-wisecoders,JAVA 读写DBF文件工具包

    1. **JDBC接口**:`dbf-jdbc-wisecoders`通过提供一个类似于JDBC(Java Database Connectivity)的接口,让Java开发者可以使用他们熟悉的SQL查询来访问和操作DBF文件。这大大简化了代码编写,使得DBF文件的处理如同...

    hive-jdbc-uber-2.6.5.0-292.jar驱动

    5. **事务管理**:虽然Hive本身不完全支持ACID事务,但驱动提供了部分事务管理能力。 6. **安全认证**:支持Kerberos等安全协议,确保数据访问的安全性。 7. **性能优化**:通过优化网络通信和数据传输,提高数据...

    hive-jdbc-1.1.0-cdh5.12.1 连接库 jar包

    Hive JDBC还支持多种特性,如预编译的`PreparedStatement`,事务处理,以及批处理等,提高了性能和安全性。对于大数据应用来说,Hive JDBC是一个强大而灵活的工具,能够帮助开发者轻松地将Hadoop集群的数据整合到...

    jdbc-helper-0.3.1

    《jdbc-helper-0.3.1:Google封装的高效JDBC工具详解》 在Java开发中,数据库操作是不可或缺的一部分,而JDBC(Java Database Connectivity)作为Java与数据库交互的标准接口,扮演着至关重要的角色。然而,原生的...

    Sqlite-jdbc-3.7.2.jar和sqlite-jdbc-3.20.1.jar上传,亲测可用

    在实际应用中,还需要考虑错误处理、事务管理、性能优化等高级话题。比如,为了提高性能,可以使用批处理(Batch Processing)来一次执行多个SQL语句,或者使用预编译的`PreparedStatement`来减少解析SQL的时间。...

    sqljdbc_7.4.1.0_enu.tar.gz、mssql-jdbc-7.4.1.jre8.jar 等

    这个版本提供了对SQL Server的各种功能支持,包括但不限于连接、查询、事务处理、批处理等,并且遵循JDBC API标准,使得Java开发者可以方便地操作SQL Server数据库。 标签中的"sqlserverjdbc"是SQL Server JDBC驱动...

    gt-jdbc-2.6.5.jar_oracle_jdbc_Geotools_

    6. **Transactions and Connection Management**: 驱动程序会管理与Oracle数据库的连接,处理事务,确保数据的一致性和完整性。 7. **Error Handling and Logging**: 在遇到错误或异常时,驱动程序会提供相应的错误...

    SQL Server_JDBC驱动【mssql-jdbc-6.4.0.jre8.jar】.rar

    JDBC支持事务处理,这对于保证数据一致性至关重要。你可以使用`Connection`对象的`setAutoCommit(false)`来关闭自动提交,然后手动控制事务的提交和回滚: ```java conn.setAutoCommit(false); // 执行SQL操作... ...

    jdbc-mysql-connector-j-8.0.31.jar jdbc-sqljdbc41.jar

    本话题将深入探讨两个关键的Java数据库连接器(JDBC)驱动,即`jdbc-mysql-connector-j-8.0.31.jar`(用于MySQL)和`jdbc-sqljdbc41.jar`(用于SQL Server),以及它们在JMeter中的应用。 首先,`jdbc-mysql-...

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

    JDBC进阶2

    jdbc-drivers.zip

    驱动文件通常命名为`postgresql-jdbc.jar`,提供了连接、查询、事务处理等功能。 2. **MySQL JDBC Driver (mysql)**:MySQL是另一个广泛应用的关系型数据库,它的JDBC驱动让Java开发者可以操作MySQL数据库。驱动...

    sharding-jdbc-example

    在现代的分布式数据库系统中,Sharding-JDBC作为一个轻量级的Java框架,为了解决大数据量下的性能瓶颈,提供了数据分片、读写分离、分布式事务等核心功能。本示例以"sharding-jdbc-example"为主题,涵盖了Spring-...

    sqlite-jdbc-3.32.3.2.jar,支持mips64elloongarch64可

    除了上述基本操作,SQLite JDBC驱动还支持事务处理、存储过程、批量更新等高级特性。它使得在各种操作系统和硬件平台(包括mips64elloongarch64)上使用SQLite变得更加便捷,对于Java开发者来说,这是一个强大的工具...

    当当开源sharding-jdbc-轻量级数据库分库分表中间件

    为了进一步提升产品的稳定性和功能性,Sharding-JDBC团队正在积极规划并实施后续的功能完善计划,包括但不限于读写分离、柔性分布式事务处理以及高可用性等功能的开发。 总之,Sharding-JDBC以其简单高效的设计理念...

    sqlite-jdbc-3.8.7.jar下载

    5. **事务管理**:SQLite支持事务处理,可以使用`Connection`对象的`setAutoCommit(false)`来开启手动提交模式,然后通过`commit()`和`rollback()`方法控制事务的提交或回滚。 6. **性能优化**:虽然SQLite是轻量级...

    shardingsphere-jdbc-5.0.0-beta依赖包

    ShardingSphere-JDBC,作为Apache ShardingSphere项目的一部分,是一个轻量级的Java框架,它无需任何中间件即可在现有数据库上实现数据分片、读写分离以及分布式事务。这个5.0.0-BETA版本的依赖包特别适用于那些不...

    Easysoft JDBC-ODBC Bridge_jdbc_java_odbc_database_methodcpo_

    - **事务支持**:提供了ACID(原子性、一致性、隔离性和持久性)级别的事务管理。 - **并发性**:支持多线程和并发连接,适用于高并发的应用场景。 - **诊断和监控**:提供详细的日志和性能统计,便于故障排查和系统...

    clickhouse-jdbc-0.1.50d.zip

    在开发过程中,`clickhouse-jdbc`库还支持预编译的`PreparedStatement`,批量操作,以及事务管理等功能,这极大地提高了代码的安全性和效率。此外,为了优化性能,可以使用`clickhouse-jdbc`的批处理特性,一次性...

    sqlite-jdbc-3.7.2

    6. **事务处理**:SQLite支持事务,你可以使用`conn.setAutoCommit(false)`来禁用自动提交,并通过`conn.commit()`或`conn.rollback()`手动控制事务。 7. **关闭资源**:在完成数据库操作后,记得关闭`Connection`,...

Global site tag (gtag.js) - Google Analytics