最近在看jdbc specification,昨天刚看到chapter 10:Transactions。有些概念感觉比较模糊,所以就搜索了相关的信息,总结一下
1、事务的概念
可能各种数据源都是有事务的,但是因为数据库最常见,所以我这里就把事务理解为数据库特有的概念了
事务就是将一组操作视为一个整体,具有ACID的性质:
原子性(Atomic):事务中的操作要么全部成功,要么全部失败
一致性(Consistent):事务处理前后,数据状态保持一致
隔离性(Isolated):一个事务的处理,不影响另一个事务的处理
持久性(Durable):事务处理成功后,应该在数据库里持久化
上面的4个性质,我不太理解一致性(Consistent)是什么意思
前面讲的概念是从网上找的,举例子会比较简单,就是到处都能看到的那个银行转账的例子:A转100块钱给B
这里有2个操作:
A-100;
B+100;
这2个操作必须一起成功,或者一起失败,这个就是最简单的事务
2、事务边界
事务边界的概念是为了描述,事务何时开始,以及何时结束
似乎有2种:
显式事务:以begin transaction开始,以commit或者rollback结束
隐式事务:每次当前事务commit或者rollback之后,就自动开启新事务
这个似乎和数据库产品的具体实现有关
3、事务并发与事务隔离
如果对于一个数据库,只有一个连接对其进行操作,那么就不存在并发的问题。数据库中的所有记录都是该连接独占的
但是在实际中,有大量的连接同时操作数据库,所以就涉及到并发的问题。因此才需要设置事务隔离,使得不同的事务不会互相影响
可以这样认为:
事务相互的隔离程度越高,往往意味着更多的等待,因此并发能力就越弱;相反,事务的并发能力越强,事务相互的隔离程度就越弱,比较容易出现错误数据的问题
这是无法避免的,当前无法做到并发能力和数据正确性两全其美,只能“权衡选择”一个折中的方式
4、事务并发可能引起的问题
对于表t
脏读(dirty read)
事务A:
select t.age where t.id = 1;
事务B:
update t set age = 21 where t.id = 1;
rollback;
当事务B的update语句执行,但是回滚之前,事务A读取到了21的值;然后事务B回滚了,age值回滚为20。事务A读取到的是一个错误的值,这种情况叫脏读
不可重复读(unrepeatable read)
事务A:
select t.age where t.id = 1;
select t.age where t.id = 1;
事务B:
update t set age = 21 where t.id = 1;
commit;
事务A首先读出值20,然后事务B执行并commit,事务A读出21。在同一个事务A里,读出不同的值,这种情况叫不可重复读
幻读(phantom read)
事务A:
select t.name where t.age = 20;
select t.name where t.age = 20;
事务B:
insert into t values ("2","jim","20");
commit;
事务A读出1条记录,然后事务B执行并commit,事务A读出2条记录。在同一个事务A里,先后查询得到不同的记录条数,这种情况叫幻读
5、事务隔离级别
为了避免上述的3种(不好的)情况,可以设置数据库的事务隔离级别
事务隔离级别越低,就越无法避免上述情况,但是由于加锁少,也就越不影响并发性能。相反,事务隔离级别越高,越能避免上述情况的发生,但是对并发性能的影响就越大
所以,设置事务隔离级别,实际上是对数据正确性,和并发性能的一种权衡取舍
隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交(read uncommitted) | 允许 | 允许 | 允许 |
读已提交(read committed) | 不允许 | 允许 | 允许 |
可重复读(repeatable read) | 不允许 | 不允许 | 允许 |
可串行(serializable) | 不允许 | 不允许 | 不允许 |
6、JAVA事务
对于java应用,数据库操作通过jdbc实现。CRUD都是通过方法间接实现的,事务的控制也转移到代码里。所以把数据库事务,不准确地称为“java transaction”
java transaction有2种,一种是jdbc事务,一种是JTA事务
jdbc事务的相关接口是java.sql.Connection,有
setAutoCommit();
commit();
rollback();
等事务相关方法
JTA事务比较复杂点,跟本文关系比较远,后面有机会再专门说明
另外,现在很多应用框架,都对事务处理进行了封装,比如hibernate通过session管理事务、spring的声明式事务等。其实都是对jdbc事务和JTA事务的封装
分享到:
相关推荐
Redis从入门到精通高清,迅雷播放器组件可顺利播放
1.web服务器与数据库服务器同时启动msdtc服务 2.... 控制面板->管理工具->组件服务->计算机->我的电脑->本地DTC .Net示例: 添加引用System.Transactions using (TransactionScope scope = new ...
... ... ... ... ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...事务处理 ...事务性消息排队 ...小结 ...处理COM+事务 ...控制事务结果 ...指定事务属性 ...确定事务情境 ...建立事务性COM+组件 ...小结 ...了解事务 ...事务与多层应用程序 ...小结
律师事务所实习小结 .doc
律师事务所实习心得小结.doc
公司法律事务部主管工作小结.docx
律师事务所办案小结 (3).docx
大学生暑期律师事务所实习小结.docx
大学生暑期律师事务所实习小结.pdf
会计事务所工作总结及小结.doc
2021大学生暑期律师事务所实习小结.docx
【会计师事务所实习小结】 实习是大学毕业生迈向社会的重要一步,通过实习,我们可以将书本上的理论知识与实际工作相结合,提升自我适应社会的能力。在广州皓程会计师事务所有限公司的实习经历,让我深刻体验到了...
20xx.10 会计师事务所入职培训小结.docx
### 律师事务所办案流程详解 #### 一、接待和受理 **1.1 接待与初步咨询** 律师事务所在接待客户时,需确保律师能够详细询问客户的背景信息及相关情况,并做好记录。这一环节旨在了解客户的诉求及案件基本情况,...
44-redis-redis事务小结.avi 45-redis-redis消息的发布与订阅.avi 46-redis-redis的主从复制-提供三台redis服务.avi 47-redis-redis的主从复制-启动三台redis服务.avi 48-redis-redis的主从复制-设置主从关系、全量...
在前面的一篇文章中已经讲过Django事务小结 ,但里面没有提到在同一个方法里面既有ORM 又有 自定义SQL 语句的情况。 如果是单纯的ORM ,可以这样做,假设已经定义好model, User,Category。 from django.db import ...
实习是连接理论与实践的重要桥梁,尤其对于法律专业的学生来说,律师事务所的实习经历至关重要。我有幸在浦东的三石律师事务所实习,跟随经验丰富的江律师,深入了解了律师行业的真实面貌。 在事务所实习期间,我...
总结,这篇实习小结揭示了法律实习生在实习过程中所学习和领悟的诸多方面,包括案件处理、文书撰写、沟通技巧和职业素养的提升,以及持续学习和自我改进的重要性。这些知识点对于任何想要从事法律行业的人来说都是...