分布式事务之数据库事务与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,也就是可重复读。



相关文章
|
16天前
|
SQL 数据库 数据安全/隐私保护
SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
【8月更文挑战第14天】解决SQL Server事务复制Log Reader作业因数据库所有者问题无法启动的方法:首先验证数据库所有者是否有效并具足够权限;若非,使用`ALTER AUTHORIZATION`更改为有效登录名。其次,确认Log Reader使用的登录名拥有读取事务日志所需的角色权限。还需检查复制配置是否准确无误,并验证Log Reader代理的连接信息及参数。重启SQL Server Agent服务或手动启动Log Reader作业亦可能解决问题。最后,审查SQL Server错误日志及Windows事件查看器以获取更多线索。
|
16天前
|
Java 数据库连接 网络安全
JDBC数据库编程(java实训报告)
这篇文章是关于JDBC数据库编程的实训报告,涵盖了实验要求、实验环境、实验内容和总结。文中详细介绍了如何使用Java JDBC技术连接数据库,并进行增删改查等基本操作。实验内容包括建立数据库连接、查询、添加、删除和修改数据,每个部分都提供了相应的Java代码示例和操作测试结果截图。作者在总结中分享了在实验过程中遇到的问题和解决方案,以及对Java与数据库连接操作的掌握情况。
JDBC数据库编程(java实训报告)
|
1天前
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
|
22天前
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
40 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
|
22天前
|
SQL Java 关系型数据库
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
49 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(上)
|
6天前
|
存储 缓存 负载均衡
【PolarDB-X 技术揭秘】Lizard B+tree:揭秘分布式数据库索引优化的终极奥秘!
【8月更文挑战第25天】PolarDB-X是阿里云的一款分布式数据库产品,其核心组件Lizard B+tree针对分布式环境优化,解决了传统B+tree面临的数据分片与跨节点查询等问题。Lizard B+tree通过一致性哈希实现数据分片,确保分布式一致性;智能分区实现了负载均衡;高效的搜索算法与缓存机制降低了查询延迟;副本机制确保了系统的高可用性。此外,PolarDB-X通过自适应分支因子、缓存优化、异步写入、数据压缩和智能分片等策略进一步提升了Lizard B+tree的性能,使其能够在分布式环境下提供高性能的索引服务。这些优化不仅提高了查询速度,还确保了系统的稳定性和可靠性。
27 5
|
7天前
|
运维 安全 Cloud Native
核心系统转型问题之分布式数据库和数据访问中间件协作如何解决
核心系统转型问题之分布式数据库和数据访问中间件协作如何解决
|
10天前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
23 1
|
17天前
|
SQL 存储 Java
完整java开发中JDBC连接数据库代码和步骤
该博客文章详细介绍了使用JDBC连接数据库的完整步骤,包括加载JDBC驱动、提供连接URL、创建数据库连接、执行SQL语句、处理结果以及关闭JDBC对象的过程,并提供了相应的示例代码。
|
22天前
|
SQL 关系型数据库 MySQL
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(一、MySQL超详细学习笔记)
26 6
下一篇
云函数