`
- 浏览:
183628 次
- 性别:
- 来自:
武汉
-
近期遇到了不少并发和事务问题,总结如下
1.锁 必须在取数据之前。 现在的事务主要是通过锁数据并通过在后面的校验中验证状态实现的,
要注意,后面的验证数据一定要是加锁之后取出来的数据,比如验证订单状态能否进行当前操作时
要重新取一下订单。
2.锁的粒度
原则:粒度越小越好,但同时也要在不影响性能的情况下,考虑实现的方便和代码的结构性。
举例: 当仅仅时对订单进行操作时,不要锁住客户,但是由于下单时没有订单,这种情况下就要锁客户,续订和续订的修改是公用的方法,这样在这方法中就要判断什么时候要锁客户,什么时候要锁订单,导致多余的判断,代码结构不好。这个时候考虑所有订单操作都锁住客户表。
军哥原来提出过一个方法,就是专门提供一个表用来加锁,这中方法可以完全避免死锁的问题
不失为一种好的方法。
3.orcle 具有隐含锁,有些操作不需要加锁
ORACLE锁的类型在正常情况下,ORACLE会自动锁住需要加锁的资源以保护数据,这种锁是隐含的,叫隐含锁。下面指明了会产生隐含锁的SQL语句:
INSERT;UPDATE;DELETE;
4.同一个事务中可以加两次或两次以上的锁。
5.在事务外面加锁不起作用,加锁的forupdate 作为一条普通select 语句执行,下一个线程不会在锁的位置等待。
6.一些用于查询锁的sql,
应用场景,由于在测试并发时会经常用到一些锁表的问题。需要找出被什么人锁住,是在程序中锁住,还是在Pl/SQL
中锁住。
可以用如下的SQL 配合查询。
(1) 在BOSS 的查询,后面的是王英杰提供的查询。但是DMP的这几个系统表的权限没有开给我们。
select object_type,object_name,owner from dba_objects where object_id in (
select object_id from v$locked_object);
select * from v$session where username in ('FBACKOFFICE') order by status;
(2) SELECT c.sid,
c.serial#,
c.terminal || '-' || c.osuser || '-' || MODULE || ' hold ' ||
DO.object_type || ' ' || DO.object_name xx
FROM v$lock a, v$lock b, v$session c, dba_objects DO
WHERE b.type = 'TX'
AND a.sid = b.sid
AND c.sid = a.sid
AND DO.data_object_id = a.id1;
搜索结果如下:
1 202 22204 ALIBABA-11823-zhaobo.dingzhb-PL/SQL Developer hold TABLE CRM_CUSTOMER
分析下: lock 表 存当前所有的锁的情况,session 是当前访问数据库所有的用户session ,dba_objects 存放了所有表的信息,每个表作为一条记录,通过关联这三张表就可以搜索出所有的锁住表的记录
lock 的Type 有 TX TM 等 TX是记录锁,TM是表锁,由于锁表也是线锁表再锁记录,这样通过
限定b.type = 'TX'所有的锁都是能查找到的
至于搜索出的记录集比较容易看清楚:
c.terminal 终端机: 你的机器名
c.osuser :你的用户
DO.object_type :终端所用的工具,即你的PL/SQL或者程序。
DO.object_name :被锁的表名称
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
- **Spring AOP**:Spring AOP允许开发者将一些通用的业务逻辑(例如日志、事务管理等)从业务代码中抽离出来,形成一个独立的部分,即切面(Aspect)。这样做的好处是可以减少业务代码的耦合度,提高代码的可读性...
此外,考虑到性能和并发问题,合理设计事务的粒度也非常重要。 总结起来,C#中的事务处理对于编写健壮、可靠的数据库应用程序至关重要。通过理解事务的原理,掌握在C#中使用ADO.NET处理事务的方法,开发者可以确保...
为了更好地利用事务提高Java应用程序的安全性和规范性,以下是一些最佳实践: 1. **使用编程式事务管理**:适用于需要细粒度控制的场景,如示例代码所示。 2. **使用声明式事务管理**:通过配置(如Spring框架的`@...
在Spring框架中,事务管理是核心特性之一,用于确保数据操作的一致性和完整性。当一个方法(A方法)内部调用另一个方法(B方法)时,可能会遇到事务控制的复杂情况。本示例代码旨在解决在A方法内部调用B方法时的回滚...
当我们谈论"A类B类C类嵌套事务问题相关类"时,这通常涉及到在Java编程环境中处理事务的一系列类或者方法。Java中的事务管理主要用于确保数据的一致性和完整性,即使在系统出现故障或异常情况下也是如此。 在Java中...
- 描述:在同一个事务中多次读取同一数据时,结果相同,但仍然可能出现幻读问题。 - 示例:事务A在两次读取之间,事务B不能插入新的数据。 4. **序列化(Serializable)**: - 描述:最高级别的隔离,解决了所有...
2. **使用Savepoint**:在大型事务中,可能需要在事务内部设置多个保存点,以便在出现问题时,可以选择性地回滚到特定的保存点,而不是回滚整个事务。`setSavepoint(String savepointName)`用于设置保存点,`...
本文将深入探讨在使用`Proxool`连接Sybase数据库时处理事务的一些常见问题及解决方案。 首先,`Proxool`是一个轻量级的数据库连接池实现,它提供了灵活的配置选项和监控功能,以适应各种项目需求。当遇到“使用...
在OSGi(Open Service Gateway Initiative)环境中配置Spring事务可能会遇到一些挑战,因为OSGi的模块化特性使得依赖管理和类加载机制与传统的Java应用不同。这篇博客文章“解决osgi spring 事务配置问题”可能深入...
隔离性确保在事务处理过程中,其他事务看到的数据是其开始时的状态或者事务完全提交后的状态,防止了并发操作间的脏读、不可重复读和幻读问题。SQL Server提供四种事务隔离级别:读未提交(Read Uncommitted)、读已...
当出现像描述中那样的问题——SQL语句执行出错但事务未回滚时,我们需要深入理解Spring事务管理的配置和机制。以下是一些关键知识点: 1. **Spring事务管理类型**: - **编程式事务管理**:通过`...
2. 分布式事务的难点:分布式系统中网络延迟、节点故障和资源竞争等问题,都可能增加事务管理的复杂度。同时,传统的关系数据库管理系统(RDBMS)在处理分布式事务时,通常采用两阶段提交(2PC)协议,这在大规模...
Spring 框架是Java开发中的重要组成部分,尤其在企业级应用中,它提供了丰富的功能,包括事务管理。本文将全面分析Spring中的编程式事务管理和声明式事务管理,旨在帮助开发者深入理解这两种事务管理方式,并在实际...
对于一些场景,可能通过合理设计来减少对分布式事务的依赖,比如通过聚合微服务来减少服务间的跨服务事务。 对于开发者来说,理解分布式事务的原理、优缺点以及使用场景是非常重要的。这不仅对于面试中的问题回答有...
关于SQL Server事务日志的问题汇总,本文将深入探讨在处理SQL Server数据库时,与事务日志相关的常见问题及其解决方案。事务日志是SQL Server数据库的关键组成部分,用于记录所有数据更改,确保数据的一致性和完整性...
在实际项目中,合理利用Spring的事务管理,能有效地保证业务逻辑的正确执行,防止数据不一致问题。在设计和编写代码时,务必考虑到事务的边界、异常处理和回滚策略,以确保系统的稳定性和可靠性。