事务

事务概述和演示:

  一件完整的事情.可以包含多个操作,操作要么成功,要么全部失败

  mysql中的事务:

     默认是事务自动提交
     手动提交:
     1.关闭自动提交
     2.手动开启一个事务
    start transaction;
    commit;
    rollback;

java中的事务:

   Connection接口的api
    setAutoCommit(false):手动的开启一个事务
    commit():提交
    rollback():回滚

   DBUitls使用事务:

    1.创建QueryRunner
       new QueryRunner():手动事务 调用他的方法的时候必须手动传入一个连接,连接得手动关闭,事务得手动控制.
           new QueryRunner(DataSource ds):自动事务 调用他的方法的时候不需要传入一个连接,连接自动关闭,事务自动控制.
    2.使用的方法 (手动事务)
       query(Conection con .....)
       update(Connection con .....)
![DBUtils在使用事务][1]


事务中要想保证在一个事务中,必须保证使用同一个Connection连接(在中项目解决方式)

    方式1:向下传递连接(将链接对象作为参数传递给dao层)
![JDBCUtils&向下传递][2]

    方式2:将连接和当前线程绑定
       ThreadLocal
       常用的方法:
        set(Object value)
        Object get()
        remove()
![自定义工具类创建链接对象&和线程绑定][3]
![调用工具类][4]

事务的特性:

ACID

 - 原子性 -- 事务不可分割.
 - 一致性 -- 事务执行的前后数据的完整性保持一致.
 - 隔离性 -- 一个事务执行的过程中,不应该受到其他的事务的干扰.
 - 持久性 -- 事务一旦提交,数据就永久保持到数据库中.

若不考虑隔离性的时候会发生的问题

 - 脏读        - 一个事务读到了另一个事务未提交的数据.
 - 不可重复读  - 一个事务读到了另一个事务已经提交的update数据,导致多次查询结果不一致.
 - 虚读        - 一个事务读到了另一个事务已经提交的insert数据,导致多次查询结构不一致.

设置隔离级别

通过设置隔离级别可以解决上面的问题
 - read uncommitted:读未提交 什么问题都避免不了
 - read committed:读已提交 避免脏读
 - repeatable read:可重复读 避免脏读和不可重复读
 - serializable:串行化 避免所有的问题 锁表
  安全:
    serializable>repeatable read>read committed>read uncommitted
  效率
    serializable<repeatable read<read committed<read uncommitted
    
mysql中默认隔离级别 repeatable read
oracle中默认隔离级别 read committed
posted @ 2018-05-20 20:24  苏亿  阅读(161)  评论(0编辑  收藏  举报