一.事物
1.概述:事务指逻辑上的一组操作,组成这组操作的单元要么全部成功,要么全部失败
2.作用:保证一组操作全部成功或者失败
3.MYSQL进行事务管理
(1)自动事务(mysql默认):一句sql语句就是一个事务(自动生效了)
(2)手动开启一个事务
1)start transaction;开始事物
2)commit;提交
3)rollback;回滚
(3)查看MYSQL中事务是否自动提交:show variables like '%commit%';
(4)设置自动提交的参数为OFF:set autocommit = 0;-- 0:OFF 1:ON
二.JDBC中的事物管理
1. connection对象的API
(1)connection.setAutoCommit(boolean autoCommit);true:自动提交;false:不自动提交(开启事物,手动控制)
(2)connection.rollback() ;回滚
(3)connection.commit();提交
2.DBUtils实现事务管理
(1)没有事物(事物自动提交)
1)QueryRunner(DataSource ds) 此构造有传递连接,使用sql方法时无需添加conn对象。自动提交事务
2)query(String sql, Object[] params, ResultSetHandler
3)update(String sql, Object... params)
(2)有事物(手动控制)
1)QueryRunner() :此构造没有传递连接,使用sql方法时需要给方法添加conn对象。手动提交事务时使用
2)query(Connection,String sql, Object[] params, ResultSetHandler
3)update(Connection,String sql, Object... params)
三.事物总结
1.事务的特性
(1)原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
(2)一致性(Consistency)事务前后数据的完整性必须保持一致
(3)隔离性(Isolation)事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离
(4)持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
2.如果不考虑隔离性,会引发下面的问题
(1)脏读:指一个事务读取了另外一个事务未提交的数据
(2)不可重复读:在一个事务中,两次查询的结果不一致(针对的是 update操作)
(3)虚读(幻读):在一个事务中,两次查询的结果不一致(针对的是 insert操作)
3.可以通过设置事物隔离级别解决读的问题
(1)read uncommitted:读未提交----最低级别,以上情况问题都不能避免
(2)Read committed:读已提交----可避免脏读情况发生(oracle默认)
(3)Repeatable read:可重复读----可避免脏读、不可重复读情况的发生,不可以避免虚读(mysql默认)
(4)Serializable:串行化----可避免脏读、不可重复读、虚读情况的发生
4.设置事物隔离级别
set session transaction isolation level 隔离级别 ;
5.查询当前事务隔离级别select @@tx_isolation;
6.隔离级别:Serializable>repeatable read > read committed > read uncommitted
7.执行效率:Serializable