首页 > 其他分享 >jdbc事物|5-3

jdbc事物|5-3

时间:2023-05-04 14:32:17浏览次数:38  
标签:语句 事务 jdbc 事物 SQL 执行 数据库 conn

数据库事务(Transaction)是由若干个SQL语句构成的一个操作序列,有点类似于Java的synchronized同步。数据库系统保证在一个事务中的所有SQL要么全部执行成功,要么全部不执行,即数据库事务具有ACID特性:

  • Atomicity:原子性
  • Consistency:一致性
  • Isolation:隔离性
  • Durability:持久性

数据库事务可以并发执行,而数据库系统从效率考虑,对事务定义了不同的隔离级别。SQL标准定义了4种隔离级别,分别对应可能出现的数据不一致的情况:

Isolation Level

脏读(Dirty Read)

不可重复读(Non Repeatable Read)

幻读(Phantom Read)

Read Uncommitted

Yes

Yes

Yes

Read Committed

-

Yes

Yes

Repeatable Read

-

-

Yes

Serializable

-

-

-

对应用程序来说,数据库事务非常重要,很多运行着关键任务的应用程序,都必须依赖数据库事务保证程序的结果正常。

举个例子:假设小明准备给小红支付100,两人在数据库中的记录主键分别是123456,那么用两条SQL语句操作如下:

UPDATE accounts SET balance = balance - 100 WHERE id = 123 AND balance >= 100;
UPDATE accounts SET balance = balance + 100 WHERE id = 456;

这两条语句必须以事务方式执行才能保证业务的正确性,因为一旦第一条SQL执行成功而第二条SQL失败的话,系统的钱就会凭空减少100,而有了事务,要么这笔转账成功,要么转账失败,双方账户的钱都不变。

这里我们不讨论详细的SQL事务,如果对SQL事务不熟悉,请参考SQL事务

要在JDBC中执行事务,本质上就是如何把多条SQL包裹在一个数据库事务中执行。我们来看JDBC的事务代码:

Connection conn = openConnection();
try {
    // 关闭自动提交:
    conn.setAutoCommit(false);
    // 执行多条SQL语句:
    insert(); update(); delete();
    // 提交事务:
    conn.commit();
} catch (SQLException e) {
    // 回滚事务:
    conn.rollback();
} finally {
    conn.setAutoCommit(true);
    conn.close();
}

其中,开启事务的关键代码是conn.setAutoCommit(false),表示关闭自动提交。提交事务的代码在执行完指定的若干条SQL语句后,调用conn.commit()。要注意事务不是总能成功,如果事务提交失败,会抛出SQL异常(也可能在执行SQL语句的时候就抛出了),此时我们必须捕获并调用conn.rollback()回滚事务。最后,在finally中通过conn.setAutoCommit(true)Connection对象的状态恢复到初始值。

实际上,默认情况下,我们获取到Connection连接后,总是处于“自动提交”模式,也就是每执行一条SQL都是作为事务自动执行的,这也是为什么前面几节我们的更新操作总能成功的原因:因为默认有这种“隐式事务”。只要关闭了ConnectionautoCommit,那么就可以在一个事务中执行多条语句,事务以commit()方法结束。

如果要设定事务的隔离级别,可以使用如下代码:

// 设定隔离级别为READ COMMITTED:
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

如果没有调用上述方法,那么会使用数据库的默认隔离级别。MySQL的默认隔离级别是REPEATABLE_READ

标签:语句,事务,jdbc,事物,SQL,执行,数据库,conn
From: https://blog.51cto.com/wusen/6242761

相关文章

  • jdbc更新|5-2
    数据库操作总结起来就四个字:增删改查,行话叫CRUD:Create,Retrieve,Update和Delete。查就是查询,我们已经讲过了,就是使用PreparedStatement进行各种SELECT,然后处理结果集。现在我们来看看如何使用JDBC进行增删改。插入插入操作是INSERT,即插入一条新记录。通过JDBC进行插入,本质上也是用Pre......
  • SQL后半部和JDBC
    SQL后半部 排序orderbyasc升序desc降序select*from表名orderby列名asc;select*from表名orderby列名asc,列名desc; 聚合count selectcount(*)from表名where列名>200;sum selectsum(列名)from表名;maxminavg平均值 分组gr......
  • 使用 Sharding Jdbc 实现读写分离
    上一篇博客介绍了MySQL的主从复制的搭建,为实现读写分离创造了条件。对于一个网站来说,80%来源于读操作,绝大多数情况下的网站宕机,都是由于过多的读操作导致的,因此在实际的生产环境中,经常会搭建一主多从的架构,主库只负责写操作,多个从库用来负责读操作,对于少量需要实时获取信息的读......
  • 学习jdbc时遇到的问题
    jar包问题问题描述:java.sql.SQLException:Unabletoloadauthenticationplugin'caching_sha2_password”如果是上述的问题,可能就是jar包的问题我的Mysql是8.0.26的,而我所用的Java包时MySQL5的Java包,这时只要把jar包更改为MySQL8的jar包即可解决问题成功使用......
  • JDBC
    1.JDBC是什么JavaDataBaseConnectivity(Java语言连接数据库)2.JDBC的本质是什么?JDBC是SUN公司制定的一套接口(interface)java.sql.*;(这个软件包下有很多接口。)接口都有调用者和实现者。面向接口调用、面向接口写实现类,这都属于面向接口编程。2.1为什么要面......
  • JAVA的Jdbc连接Access数据库
      Eclipse加入Access_JDBC30.jar:   程序如下:importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.Statement;publicclassconn{publicstaticStringconnct(){try{......
  • odbc和jdbc的区别与联系
    一、定义 ODBC (OpeDatabaseConnectivity),开放数据库互联,是微软公司开发和定义的一套数据库访问标准,用户也可以直接将sql语句送给ODBC。通过使用ODBC,应用程序能够使用相同的源代码和各种各样的数据库进行交互。下面是ODBC应用系统的体系结构。一个基于ODBC的应用程序,对数据......
  • 项目启动时数据库报错:com.mysql.cj.jdbc.exceptions.CommunicationsException: Commun
    项目启动时报错:com.mysql.cj.jdbc.exceptions.CommunicationsException:Communicationslinkfailure解决方法(转载):https://blog.csdn.net/lvoelife/article/details/129284611?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTR......
  • java -- JDBC
    JDBCJDBC(JavaDataBaseConnectivity,java数据库连接)是一种用于执行SQL语句的JavaAPI。JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由......
  • sql中的事物
    sql中的事物MySQL默认的是repeatableread首先要开启事物starttransaction;第二所有的修改删除都为一个事物当没有提交的时候只是操作的缓存中的数据,*此时查询的会存在幻读(读取的都是为修改的数据)第三在未提交前可以回滚事物rollback;第四提交commit;会默认关闭此次事......