前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式事务之数据库事务与JDBC事务实现(一)

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

作者头像
蒋老湿
修改2019-12-09 14:35:34
9550
修改2019-12-09 14:35:34
举报
文章被收录于专栏:技术栈技术栈

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

微服务系统最大的挑战:

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

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

以数据库事务演示为例sql:

代码语言:txt
复制
BEGIN TRANSACTION; --开启事务
UPDATE t_user SET amount = amount-100 WHERE username='BatMan';
UPDATE t_user SET amount = amount+100 WHERE username='SuperMan';
COMMIT; --提交事务
--ROLLBACK --回滚事务

其中ResourceManager为事务管理器,JDBC Driver为事务的具体实现,使用不同的驱动则代表不同的事务实现方式。 JDBC事务管理:以java 程序为例子

代码语言:txt
复制
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。

代码语言:txt
复制
-- 查看全局事务隔离级别,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; --提交事务
代码语言:txt
复制
-- 设置事务隔离级别(不commit也可以读取最新内容,类似于脏读)
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 
BEGIN TRANSACTION; --开启事务
SELECT * FROM t_user;
SELECT * FROM t_user WHERE username='BatMan';
COMMIT; --提交事务

以navicat for mysql 工具为例,开启一个查询,执行第一段sql ,但最后一行COMMIT还未执行。这时再开一个查询窗口执行第二段sql,但第2行sql先不执行,从第3行开始执行,此时可以看到结果还是和最初的数据一致,没有增加也没有减少,这就是事务的隔离性:一个事务的执行过程中不能影响到其他事务的执行,即一个事务内部的操作及使用的数据对其他事务是隔离的,并发执行各个事务之间无不干扰。 此时全部执行第二段sql,因为设置了事务的隔离级别,所以此时可以看到数据有加有减少,即便第一段sql没有执行COMMIT操作。

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年08月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档