[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
1. 事务入门. 事务是一组操作的集合, 这些操作要么一起执行成功, 要么一起执行失败. JDBC和Mysql数据的事务命令如下:
Connection.setAutoCommit(false)---start transaction
Connection.rollback()-------------------rollback
Connection.commit()--------------------commit
Connection.setSavePoint()用于设置回滚点, 该方法返回一个SavePoint对象. 如果调用Connection.rollback(SavePoint sp)方法则回滚至sp锁代表的回滚点.
如果一个线程尚未开启事务, 则数据库将自动提交所有修改.
线程开启事务之后, 执行了提交或者回滚时事务结束; 如果断开连接时事务既没有提交也没有回滚, 数据库将自动放弃所有修改(即自动回滚至事务开启处).
例子:
-
-
-
-
-
-
- public class DbTransaction {
- @Test
- public void transactionWithNoexception() {
- Connection conn = null;
- PreparedStatement st = null;
-
- try {
- conn = JdbcUtils.getConnection();
-
- conn.setAutoCommit(false);
-
- String sql = "update transaction set money=money+1000 where id=1";
- st = conn.prepareStatement(sql);
- st.executeUpdate();
-
- sql = "update transaction set money=money-1000 where id=2";
- st = conn.prepareStatement(sql);
- st.executeUpdate();
-
- sql = "select * from transaction";
- st = conn.prepareStatement(sql);
- ResultSet rs = st.executeQuery();
- while(rs.next() ) {
- System.out.println("--------------------");
- System.out.println(rs.getInt("id"));
- System.out.println(rs.getString("name"));
- System.out.println(rs.getFloat("money"));
- }
-
- conn.commit();
- } catch (Exception e) {
- e.printStackTrace();
- if (conn != null) {
- try {
- conn.rollback();
- } catch (SQLException e1) {
- e1.printStackTrace();
- }
- }
- } finally {
- JdbcUtils.release(null, st, conn);
- }
- }
- }
2. 事务的4大特性ACID.
a. 原子性(Atomicity): 事务是一个不可分割的执行单位, 事务中的操作要么全部成功, 要么全部失败.
b. 一致性(Consistency): 事务前后数据的完整性需要保持一致. 例如在一个转账事务中, 所有账户的总金额在事务执行前后必须相同.
c. 隔离性(Isolation): 事务的隔离性定义多个线程并发访问数据库时, 系统所采取的隔离措施. 详见后面的分析.
d. 持久性(Durability): 指事务一旦提交成功, 该事务对数据库中的数据所作的修改永久有效, 不可因外部意外情况对其有任何影响.
3. 事务的隔离性主要为了避免以下情况的发生:
a. 脏读. 指的是A事务读取了其他事务尚未提交的修改.
b. 不可重复读. 指的是A事务多次读取某行中的数据, 如果其他事务在A事务的读取间隔期间提交了对该行数据的修改, 而导致A事务多次读取的结果不同.
c. 虚读. 指的是A事务读取到了其他事务插入的数据.
4. 事务的隔离级别. sql标准定义了四种隔离级别:
a. read uncommitted: 最低级别, 无法避免脏读, 不可重复读, 虚读等情况的发生.
b. read committed: 可以避免脏读的发生, 但不能避免不可重复读和虚读的发生.
c. repeatable read: 可以避免脏读和不可重复读的发生, 但不能避免虚读的发生. 处于该级别的事务会对数据库中已有记录加锁, 使得其他事务无法提交对已有记录的修改, 但允许插入新的数据.
d. serializable: 可以避免以上所有情况的发生. 处于该级别的事务会对整个数据库加锁, 使得其他事务无法提交对该数据库的任何修改. 此时相当于单线程操作.
Mysql支持以上4种隔离级别, 其默认的隔离级别为repeatable read. set transaction isolation level语句可以更改当前事务的隔离级别, 如set transaction isolation level read committed语句将当前事务的隔离级别设置为read committed. select @@tx_isolation语句用于获取当前事务的隔离级别. 而Oracle只支持read committed和serializable级别.
实际开发时, 需要根据项目需求选择不同的隔离级别. 尤其是不可重复读和虚读, 在某些应用场景下并非是需要避免的错误, 而是完全合法的.
隔离级别越高, 数据库的性能就越差.
检验事务的隔离级别时, 需要创建多个"已开启事务"的线程.
分享到:
相关推荐
4.1 spring事务入门---一个转账的例子 1 事务 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。 1.1 事务的特性 原子性:强调事务的不可分割。 一致性:事务的执行的前后数据的完整性...
分布式事务入门,有具体的代码 ,详细的代码,所需要的jar,完整的文档!
单数据库的事物隔离级别, 三阶段协议币两阶段提交协议多了一个阶段,那么多出来的那一个阶段操作带来什么好处
翻译的FIBPlus入门教程,适用于FireBird,InterBase入门者.
关于SQL Server事务的基本使用方法
linq-to-sql-分布式事务处理,简单明了的 事务入门,从简单事务到分布式事务,清晰易懂,很好的入门资料
URTracker事务跟踪系统入门,ppt
总结了jdbc的入门知识、分页和事务方面的知识,精辟!
翻译的FIBPlus事务入门文档,适用于FireBird InterBase入门者.
2数据库事务的介绍 3mysq|事务讲解 4mysq|-JDBC事务讲解1 5mysqI-JDBC事务讲解2 6搭建一个spring-boot项目 7idea插件easycode 8spring-boot标签事务 9spring-boot jms介绍 10spring-boot jta单数据源事务实例 11...
3 SOA分布式事务解决方案 3.1 基于XA协议的两阶段提交方案 交易中间件与数据库通过 XA 接口规范,使用两阶段提交来完成一个全局事务, XA 规范的基础是两阶段提交协议。 第一阶段是表决阶段,所有参与者都将本事务...
spring声明式事务管理_入门
压缩包内包含了众多spring学习资料如:Spring从入门到精通.pdf ,spring+...spring事务.pdf,Spring_Framework-3-AOP.ppt,Spring-Hibernate_Frameworks.ppt等学习资料 都是经过我认真帅选过的学习资料,分享给大家用一用
《Redis入门指南》是一本Redis的入门指导书籍,以通俗易懂的方式介绍了Redis基础与实践方面的知识,包括历史与特性、在开发和生产环境中部署运行Redis、数据类型与命令、使用Redis实现队列、事务、复制、管道、持久...
第1章金融人python入门 课时3-Python在金融资管领域中的应用.mp4 课时4-补充-Mac系统下安装anaconda步骤.mp4 课时5-Python基础知识(一).mp4 课时6-Fython基础知识(二).mp4 课时7-Python基础金融分析应用.mp4 课时8-...
《Redis入门指南》是一本Redis的入门指导书籍,以通俗易懂的方式介绍了Redis基础与实践方面的知识,包括历史与特性、在开发和生产环境中部署运行Redis、数据类型与命令、使用Redis实现队列、事务、复制、管道、持久...
《Redis入门指南(第2版)》是一本Redis的入门指导书籍,以通俗易懂的方式介绍了Redis基础与实践方面的知识,包括历史与特性、在开发和生产环境中部署运行Redis、数据类型与命令、使用Redis实现队列、事务、复制、...
《Redis入门指南(第2版)》是一本Redis的入门指导书籍,以通俗易懂的方式介绍了Redis基础与实践方面的知识,包括历史与特性、在开发和生产环境中部署运行Redis、数据类型与命令、使用Redis实现队列、事务、复制、...