当前位置:Gxlcms > 数据库问题 > python-sqlite3事务

python-sqlite3事务

时间:2021-07-01 10:21:17 帮助过:21人阅读

在connect()中不传入 isolation_level

事务处理:

使用connection.commit()

  1. <span style="color: #008000">#</span><span style="color: #008000">!/usr/bin/env python</span><span style="color: #008000">
  2. #</span><span style="color: #008000"> -*- coding:utf-8 -*-</span>
  3. <span style="color: #800000">‘‘‘</span><span style="color: #800000">sqlite3事务总结:
  4. 在connect()中不传入 isolation_level
  5. 事务处理:
  6. 使用connection.commit()
  7. 分析:
  8. 智能commit状态:
  9. 生成方式: 在connect()中不传入 isolation_level, 此时isolation_level==‘‘
  10. 在进行 执行Data Modification Language (DML) 操作(INSERT/UPDATE/DELETE/REPLACE)时, 会自动打开一个事务,
  11. 在执行 非DML, 非query (非 SELECT 和上面提到的)语句时, 会隐式执行commit
  12. 可以使用 connection.commit()方法来进行提交
  13. 注意:
  14. 不能和cur.execute("COMMIT")共用
  15. 自动commit状态:
  16. 生成方式: 在connect()中传入 isolation_level=None
  17. 这样,在任何DML操作时,都会自动提交
  18. 事务处理
  19. connection.execute("BEGIN TRANSACTION")
  20. connection.execute("COMMIT")
  21. 如果不使用事务, 批量添加数据非常缓慢
  22. 数据对比:
  23. 两种方式, 事务耗时差别不大
  24. count = 100000
  25. 智能commit即时提交耗时: 0.621
  26. 自动commit耗时: 0.601
  27. 智能commit即时提交耗时: 0.588
  28. 自动commit耗时: 0.581
  29. 智能commit即时提交耗时: 0.598
  30. 自动commit耗时: 0.588
  31. 智能commit即时提交耗时: 0.589
  32. 自动commit耗时: 0.602
  33. 智能commit即时提交耗时: 0.588
  34. 自动commit耗时: 0.622
  35. </span><span style="color: #800000">‘‘‘</span>
  36. <span style="color: #0000ff">import</span><span style="color: #000000"> sys
  37. </span><span style="color: #0000ff">import</span><span style="color: #000000"> time
  38. </span><span style="color: #0000ff">class</span><span style="color: #000000"> Elapse_time(object):
  39. </span><span style="color: #800000">‘‘‘</span><span style="color: #800000">耗时统计工具</span><span style="color: #800000">‘‘‘</span>
  40. <span style="color: #0000ff">def</span> <span style="color: #800080">__init__</span>(self, prompt=<span style="color: #800000">‘‘</span><span style="color: #000000">):
  41. self.prompt </span>=<span style="color: #000000"> prompt
  42. self.start </span>=<span style="color: #000000"> time.time()
  43. </span><span style="color: #0000ff">def</span> <span style="color: #800080">__del__</span><span style="color: #000000">(self):
  44. </span><span style="color: #0000ff">print</span>(<span style="color: #800000">‘</span><span style="color: #800000">%s耗时: %.3f</span><span style="color: #800000">‘</span> % (self.prompt, time.time() -<span style="color: #000000"> self.start))
  45. CElapseTime </span>=<span style="color: #000000"> Elapse_time
  46. </span><span style="color: #0000ff">import</span><span style="color: #000000"> sqlite3
  47. </span><span style="color: #008000">#</span><span style="color: #008000"> -------------------------------------------------------------------------------</span><span style="color: #008000">
  48. #</span><span style="color: #008000"> 测试</span><span style="color: #008000">
  49. #
  50. </span><span style="color: #000000">
  51. filename </span>= <span style="color: #800000">‘</span><span style="color: #800000">e:/temp/a.db</span><span style="color: #800000">‘</span>
  52. <span style="color: #0000ff">def</span> prepare(isolation_level = <span style="color: #800000">‘‘</span><span style="color: #000000">):
  53. connection </span>= sqlite3.connect(filename, isolation_level =<span style="color: #000000"> isolation_level)
  54. connection.execute(</span><span style="color: #800000">"</span><span style="color: #800000">create table IF NOT EXISTS people (num, age)</span><span style="color: #800000">"</span><span style="color: #000000">)
  55. connection.execute(</span><span style="color: #800000">‘</span><span style="color: #800000">delete from people</span><span style="color: #800000">‘</span><span style="color: #000000">)
  56. connection.commit()
  57. </span><span style="color: #0000ff">return</span><span style="color: #000000"> connection, connection.cursor()
  58. </span><span style="color: #0000ff">def</span><span style="color: #000000"> db_insert_values(cursor, count):
  59. num </span>= 1<span style="color: #000000">
  60. age </span>= 2 *<span style="color: #000000"> num
  61. </span><span style="color: #0000ff">while</span> num <=<span style="color: #000000"> count:
  62. cursor.execute(</span><span style="color: #800000">"</span><span style="color: #800000">insert into people values (?, ?)</span><span style="color: #800000">"</span><span style="color: #000000">, (num, age))
  63. num </span>+= 1<span style="color: #000000">
  64. age </span>= 2 *<span style="color: #000000"> num
  65. </span><span style="color: #0000ff">def</span><span style="color: #000000"> study_case1_intelligent_commit(count):
  66. </span><span style="color: #800000">‘‘‘</span><span style="color: #800000">
  67. 在智能commit状态下, 不能和cur.execute("COMMIT")共用
  68. </span><span style="color: #800000">‘‘‘</span><span style="color: #000000">
  69. connection, cursor </span>=<span style="color: #000000"> prepare()
  70. elapse_time </span>= Elapse_time(<span style="color: #800000">‘</span><span style="color: #800000"> 智能commit</span><span style="color: #800000">‘</span><span style="color: #000000">)
  71. db_insert_values(cursor, count)
  72. </span><span style="color: #008000">#</span><span style="color: #008000">cursor.execute("COMMIT") #产生异常</span>
  73. <span style="color: #000000">
  74. cursor.execute(</span><span style="color: #800000">"</span><span style="color: #800000">select count(*) from people</span><span style="color: #800000">"</span><span style="color: #000000">)
  75. </span><span style="color: #0000ff">print</span><span style="color: #000000"> (cursor.fetchone())
  76. </span><span style="color: #0000ff">def</span><span style="color: #000000"> study_case2_autocommit(count):
  77. connection, cursor </span>= prepare(isolation_level =<span style="color: #000000"> None)
  78. elapse_time </span>= Elapse_time(<span style="color: #800000">‘</span><span style="color: #800000"> 自动commit</span><span style="color: #800000">‘</span><span style="color: #000000">)
  79. db_insert_values(cursor, count)
  80. cursor.execute(</span><span style="color: #800000">"</span><span style="color: #800000">select count(*) from people</span><span style="color: #800000">"</span><span style="color: #000000">)
  81. </span><span style="color: #0000ff">print</span><span style="color: #000000"> (cursor.fetchone())
  82. </span><span style="color: #0000ff">def</span><span style="color: #000000"> study_case3_intelligent_commit_manual(count):
  83. connection, cursor </span>=<span style="color: #000000"> prepare()
  84. elapse_time </span>= Elapse_time(<span style="color: #800000">‘</span><span style="color: #800000"> 智能commit即时提交</span><span style="color: #800000">‘</span><span style="color: #000000">)
  85. db_insert_values(cursor, count)
  86. connection.commit()
  87. cursor.execute(</span><span style="color: #800000">"</span><span style="color: #800000">select count(*) from people</span><span style="color: #800000">"</span><span style="color: #000000">)
  88. </span><span style="color: #0000ff">print</span><span style="color: #000000"> (cursor.fetchone())
  89. </span><span style="color: #0000ff">def</span><span style="color: #000000"> study_case4_autocommit_transaction(count):
  90. connection, cursor </span>= prepare(isolation_level =<span style="color: #000000"> None)
  91. elapse_time </span>= Elapse_time(<span style="color: #800000">‘</span><span style="color: #800000"> 自动commit</span><span style="color: #800000">‘</span><span style="color: #000000">)
  92. connection.execute(</span><span style="color: #800000">"</span><span style="color: #800000">BEGIN TRANSACTION;</span><span style="color: #800000">"</span>) <span style="color: #008000">#</span><span style="color: #008000"> 关键点</span>
  93. <span style="color: #000000"> db_insert_values(cursor, count)
  94. connection.execute(</span><span style="color: #800000">"</span><span style="color: #800000">COMMIT;</span><span style="color: #800000">"</span>) <span style="color: #008000">#</span><span style="color: #008000">关键点</span>
  95. <span style="color: #000000">
  96. cursor.execute(</span><span style="color: #800000">"</span><span style="color: #800000">select count(*) from people;</span><span style="color: #800000">"</span><span style="color: #000000">)
  97. </span><span style="color: #0000ff">print</span><span style="color: #000000"> (cursor.fetchone())
  98. </span><span style="color: #0000ff">if</span> <span style="color: #800080">__name__</span> == <span style="color: #800000">‘</span><span style="color: #800000">__main__</span><span style="color: #800000">‘</span><span style="color: #000000">:
  99. count </span>= 10000<span style="color: #000000">
  100. prepare()
  101. </span><span style="color: #0000ff">for</span> i <span style="color: #0000ff">in</span> range(5<span style="color: #000000">):
  102. </span><span style="color: #008000">#</span><span style="color: #008000">study_case1_intelligent_commit(count) #不提交数据</span>
  103. <span style="color: #008000">#</span><span style="color: #008000">study_case2_autocommit(count) #非常缓慢</span>
  104. <span style="color: #000000"> study_case3_intelligent_commit_manual(count)
  105. study_case4_autocommit_transaction(count)</span>

 

python-sqlite3事务

标签:class   select   nbsp   不能   批量添加数据   exe   sts   etc   tab   

人气教程排行