分布式事务之数据库事务与JDBC事务实现(一)

简介: 分布式事务之数据库事务与JDBC事务实现

著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

介绍事务的四大原则,并通过实例介绍数据库实现事务的方法,以及使用JDBC实现事务的方法。

微服务系统最大的挑战:

  • 数据的并发访问、修改;
  • 不同请求之间的数据隔离,一个业务请求修改多个数据,保证都完成或失败;
  • 发生异常时的数据回滚。

事务是以一种可靠、一致的方式,访问和操作数据库中的数据的程序单元。

16522e70215594b0_tplv-t2oaga2asx-zoom-in-crop-mark_4536_0_0_0.png

以sql的方式演示数据库事务:

BEGIN TRANSACTION; --开启事务
UPDATE t_user SET amount = amount-100 WHERE username='BatMan';
UPDATE t_user SET amount = amount+100 WHERE username='SuperMan';
COMMIT; --提交事务
ROLLBACK; --回滚事务

16522e73f56dab5f_tplv-t2oaga2asx-zoom-in-crop-mark_4536_0_0_0.png

  • ResourceManager:为事务管理器
  • JDBC Driver:事务的具体实现,使用不同的驱动包则代表不同的事务实现方式。
  • DB Connection:数据库连接
  • Resource:资源(这里指数据库)

以java 程序为例子介绍JDBC事务管理

Connection conn = getConnection();  // 创建数据库连接
conn.setAutoCommit(false);        // 设置不自动提交
Statement stmt1 = conn.prepareStatement(updateUser1Sql);
stmt1.executeUpdate();
Statement stmt2 = conn.prepareStatement(updateUser2Sql);
stmt2.executeUpdate();
conn.commit(); // or conn.rollback();  提交事务或回滚事务

这里演示一个事务的例子: 以转帐为例,SuperMan给BatMan转账100元,则SuperMan账户-100,BatMan账户+100。

第一段sql

-- 查看全局事务隔离级别,Session事务隔离级别
SELECT @@GLOBAL.tx_isolation, @@SESSION.tx_isolation;  
BEGIN TRANSACTION; --开启事务
UPDATE t_user SET amount = amount-100 WHERE username='BatMan';
UPDATE t_user SET amount = amount+100 WHERE username='SuperMan';
COMMIT; --提交事务

第二段sql

-- 设置事务隔离级别(不commit也可以读取最新内容,类似于脏读)
1: SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 
2: BEGIN TRANSACTION; --开启事务
3: SELECT * FROM t_user;
4: SELECT * FROM t_user WHERE username='BatMan';
5: COMMIT; --提交事务
  • 以navicat for mysql 工具为例,开启一个查询,执行第一段sql ,但最后一行COMMIT还未执行。这时再开一个查询窗口执行第二段sql,但第2行sql先不执行,从第3行开始执行,此时可以看到结果还是和最初的数据一致,没有增加也没有减少,这就是事务的隔离性:一个事务的执行过程中不能影响到其他事务的执行,即一个事务内部的操作及使用的数据对其他事务是隔离的,并发执行各个事务之间无不干扰。
  • 此时全部执行第二段sql,因为设置了事务的隔离级别,所以此时可以看到数据有加有减少,虽然第一段sql没有执行COMMIT操作。但任然看到了修改后的数据。

为了解决类似这种数据脏读问题可以在SELECT 语句后加 FOR UPDATEFOR UPDATE 是一个排它锁,也就是说,其他的事务是可以读取的。但是不能写入或者更新。效果等同于mysql事务级别中的Serializable。  mysql 默认的事务处理级别是REPEATABLE-READ,也就是可重复读。



相关文章
|
7天前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
5天前
|
分布式计算 Java Hadoop
杨校老师课堂之分布式数据库HBase的部署和基本操作
杨校老师课堂之分布式数据库HBase的部署和基本操作
16 0
|
1天前
|
SQL Java 数据库连接
Java开发者必知:JDBC连接数据库的“三大法宝”
【6月更文挑战第24天】Java JDBC的三大法宝简化数据库操作:①统一API接口,跨平台与各类数据库交互;②参数化查询,提升效率,防止SQL注入;③事务管理,确保数据一致性。通过这三个核心特性,开发者能更安全高效地处理数据库任务。示例代码展示了如何使用这些功能。
|
1天前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
13 3
|
1天前
|
Java 数据库连接 API
后端开发之用Mybatis简化JDBC的开发快速入门2024及数据库连接池技术和lombok工具详解
后端开发之用Mybatis简化JDBC的开发快速入门2024及数据库连接池技术和lombok工具详解
9 3
|
1天前
|
SQL 安全 Java
JDBC:Java与数据库的“月老红线”,你真的了解它吗?
【6月更文挑战第24天】JDBC是Java与数据库间的桥梁,简化了数据库交互。通过`DriverManager.getConnection()`建立连接,`PreparedStatement`执行SQL并设置参数,确保安全高效,`ResultSet`处理查询结果。这段代码展示了JDBC如何连接MySQL数据库,执行查询并打印结果,揭示了其作为“月老”的角色,使得数据操作变得简单。
|
1天前
|
SQL Java 数据库连接
惊!Java界的“金钥匙”:揭秘JDBC如何轻松开启数据库大门!
【6月更文挑战第24天】JDBC是Java连接数据库的关键,简化了数据操作。在Java项目中添加MySQL驱动后,通过`DriverManager.getConnection()`建立连接。示例代码展示了如何执行查询、处理`ResultSet`。JDBC提供了一致的接口,让开发者能轻松进行数据库交互,无论是新手还是专家,都能快速掌握,开启数据库开发之旅。
|
1天前
|
Java 关系型数据库 数据库连接
JDBC:Java与数据库的“黄金搭档”,为何它如此重要?
【6月更文挑战第24天】Java的JDBC是数据库连接的桥梁,统一API简化了与MySQL等各类数据库的交互,降低复杂性并提高效率。在库存系统示例中,JDBC允许无缝查询和更新,无需关注底层实现。作为“黄金搭档”,JDBC还支持事务、批处理等功能,确保性能和安全性,是Java开发者不可或缺的工具。
|
1天前
|
SQL Java 数据库连接
JDBC之旅:从陌生到熟悉的Java数据库连接之路
【6月更文挑战第24天】学习JDBC之旅,从新手到熟手的蜕变。通过`DriverManager.getConnection()`建立数据库连接,用`PreparedStatement`防止SQL注入。深入学习后,掌握事务管理、批处理等高级功能,应对连接异常和性能优化挑战,逐渐精通JDBC,体验编程乐趣与成长。JDBC成为开发者不可或缺的工具,开启数据库世界的大门。
|
7天前
|
Java 关系型数据库 MySQL
JavaWeb基础第一章(MySQL数据库与JDBC)
JavaWeb基础第一章(MySQL数据库与JDBC)