什么是事务:
事务是指逻辑上的一组操作,这种操作要么全部发生(提交成功),要么全部失败(回滚)。
举例 : 张三李四 进行 转账的操作
张三向转账李四 1000元 张三余额-1000元 李四余额+1000元
不应该出现的是 在转账过程中由于一些意外,使张三的余额减去了1000元, 而李四并没有收到这笔钱。 使 用事务来进行管理。 必须全部成功(张三扣款,李四收款)或者一起失败(张三李四存款不变)。
事务的四大特性(ACID):
原子性(Atomicity):是指事务一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 不能够单独运行。把一组操作放入事务中。
一致性(Consistency):事务执行的前后,数据的完整性要得到保证。
隔离性(Isolation):多个用户并发访问数据库的时候,一个用户的事务不会被其他用户的事务干扰,多个并发事务之间的数据要相互隔离。解决多个用户对同一个数据进行操作,数据库会有事务的隔离级别来解决。
持久性(Durability):一个事务一旦被提交,它对数据库中数据的的改变是永久性,即使数据库发生故障也不应该对其有影响。
并发访问问题----由隔离性引起 :
1.脏读:
指一个事务正在访问数据,并对其进行了修改,且未提交到数据库中。这时候另一个数据也访问这个数据,然后使用这个数据。因为这个数据是还未提交的数据,那么另一个事务读到的这个数据就是脏数据,依据脏数据进行的操作可能是不正确的
2.不可重复读:
指一个事务内,多次重复读取同一数据。在这个事务还未结束的时候,另一个事务也访问了该数据,并对其进行了修改,那么第一个事务两次读取的数据可能不一样,成为不可重复读。
3.幻觉读:
是指事务不独立执行时的一种现象。例:第一个事务对表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也对表进行修改,向表中插入一行新的数据。结果就是第一个事务的用户发现表中居然还有没被修改的数据,就好像发生了幻觉一样[非洲脸]。
事务的隔离级别:
- read uncommited:读取未提交的数据:哪个问题都不能解决。
- read commited:读取已提交的数据:可以解决脏读,oracle默认的级别。
- repeatable read:重读读取: 可以解决脏读和不可重复读,mysql默认的级别。
- serializable:串行化: 可以解决脏读、不可重复读、幻觉读,相当于锁表。
java事务主要有两种:jdbc事务(本地事务),jta (java tranaction api)事务(分布式事务)
一、JDBC事务操作:
jdbc默认的是自动事务,执行slq语句,executeUpdate() ---- 每执行一次executeUpdate方法 代表 事务自动提交。
jdbc的API手动事务:
(1) 开启事务:conn.setAutoCommit(false) //关闭自动提交,开启收到提交;
(2) 提交事务:coon.commit();
(3) 回滚事务:coon.rollback();
注意:控制事务的connnection必须是同一个
执行sql的connection与开启事务的connnection必须是同一个才能对事务进行控制
//通过jdbc去控制事务 Connection conn = null; //1、注册驱动 try { Class.forName("com.mysql.jdbc.Driver"); //2、获得connection conn = DriverManager.getConnection("jdbc:mysql:///web19", "root", "root"); //手动开启事务,先声明不自动提交 conn.setAutoCommit(false); //3、获得执行平台 Statement stmt = conn.createStatement(); //4、操作sql stmt.executeUpdate("update account set money=5000 where name='tom'"); //提交事务 conn.commit(); stmt.close(); conn.close(); } catch (Exception e) { try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); }
二、 框架事务
框架中事务一般交由Spring处理。Spring配置事务的方式有两种,一种是声明式事务,另一种是注解式事务。
注解事务:在Spring配置文件中加入
分布式事务:切点一般是扫描service层实现类,通过实现类配置传播特性,决定哪些方法上加事务,哪些方法上不要加事务。
事务主要有五大隔离级别和7种传播特性;五大隔离级别由低到高:主要控制是否出现脏读,不可重复读和幻觉读;7种传播特性主要决定是新建事务,还是取当前事务;
参考链接: https://blog.csdn.net/LVXIANGAN/article/details/85329630
参考链接: https://blog.csdn.net/toby1123yjh/article/details/79941788