目录
一、什么是事务?
事务就是你对数据的一次操作,这一次操作中可以是一句简单的添加语句,也可以是对多张表的多次操作
二、为什么要使用事务?
以为它安全,为什么安全?比如张三给李四转账,我们要从张三的账户扣钱,往李四的账户加钱,但是在执行时,张三扣钱的sql执行成功了,李四加钱的sql出错了,这时会出现张三的钱少了,李四的钱没加。怎么解决这种隐患呢?本次交易就是一个事务,在事务中,所有的sql要么都成功,要么都失败,这就到了事务的四个特性。
三、事务的四大属性(ACID)
- 原子性(atomicity):一个事务中有多个sql,这些sql要么都做,要么都不做;
- 一致性(consistency):一个事务中有多个sql,这些sql要么都成功,要么都失败,不存在上面的情况(张三钱少了,李四钱没变);
- 隔离性(isolation):顾名思义,就是各个事务之间相互隔离,互不影响
- 持久性(durability):事务一旦提交,数据便保留在数据库中。
四、事务的种类
- JDBC事务
- JTA(Java Transaction API)事务
- 容器事务
- 分布式事务
五、JDBC事务
1.sql语句中
还是拿demo1表
查询:
开启事务,修改name,查看表信息
事务回滚,信息查看
总结:
开启事务:START TRANSACTION
提交事务:COMMIT;
回滚事务:ROLLBACK;
2.JDBC中
意思还是sql中的意思,只不过换了种形式
Connection connection;
try{
//创建链接
connection = JDBCUtil.getConnection();
//开启手动提交事务(关闭自动提交事务)
connection.setAutoCommit(false);
//自己的数据操作
*** ***
//提交事务
connection.commit();
}catch(Exception e) {
e.printStackTrace();
//异常回滚事务
connection.rollback();
}
提出问题:
在sql语句表达事务时发现一个问题,在开启事务后对数据进行修改,查看数据是我们修改过的,回滚后再看就有回到了修改前,那么问题来了?
问题一:
这个问题叫脏读,因为读取到了没有提交的数据,这种数据叫脏数据,所以叫脏读
问题二:
这个问题叫不可重复读 ,它与脏读的区别在于没有脏数据
问题三
两个事务都对数据进行修改
上面类似问题又产生了另一个知识点:事务的隔离级别
3.事务的四个隔离级别
1.Read uncommitted:读未提交
六、JTA(Java Transaction API)事务
七、容器事务
八、分布式事务
没学到呢,后续更新
七种传播行为:required、supports、mandatory、requires_new、not supported、never、nested
今日没写完,明日更新