【问题标题】:How do I know whether my database is in serializable mode?我如何知道我的数据库是否处于可序列化模式?
【发布时间】:2016-12-18 20:05:42
【问题描述】:

我了解到您可以查看 dmv sys.databases 以获取隔离信息:

 select name
        , s.snapshot_isolation_state
        , snapshot_isolation_state_desc
        , is_read_committed_snapshot_on
        , recovery_model
        , recovery_model_desc
        , collation_name
    from sys.databases s
    ORDER BY 1 

我不明白我们如何使用来自 sys.databases 的信息来确定隔离模式。 您如何知道当前为数据库设置了哪种类型的隔离模式?

【问题讨论】:

  • 注意,只有在连接时没有指定值时才使用数据库设置。 AFAIL,所有现代 API 都将默认事务级别设置为已提交读,因此数据库设置不会有任何影响。

标签: sql sql-server sql-server-2008 tsql sql-server-2012


【解决方案1】:

DBCC UserOptions(检查“隔离级别”)

为当前连接返回激活(设置)的 SET 选项。

https://msdn.microsoft.com/en-us/library/ms180065.aspx


DBCC UserOptions 

+-------------------------+----------------+
| Set Option              | Value          |
+-------------------------+----------------+
| textsize                | 2147483647     |
+-------------------------+----------------+
| language                | us_english     |
+-------------------------+----------------+
| dateformat              | mdy            |
+-------------------------+----------------+
| datefirst               | 7              |
+-------------------------+----------------+
| lock_timeout            | -1             |
+-------------------------+----------------+
| quoted_identifier       | SET            |
+-------------------------+----------------+
| arithabort              | SET            |
+-------------------------+----------------+
| ansi_null_dflt_on       | SET            |
+-------------------------+----------------+
| ansi_warnings           | SET            |
+-------------------------+----------------+
| ansi_padding            | SET            |
+-------------------------+----------------+
| ansi_nulls              | SET            |
+-------------------------+----------------+
| concat_null_yields_null | SET            |
+-------------------------+----------------+
| isolation level         | read committed |
+-------------------------+----------------+

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

DBCC UserOptions  

+-------------------------+--------------+
| Set Option              | Value        |
+-------------------------+--------------+
| textsize                | 2147483647   |
+-------------------------+--------------+
| language                | us_english   |
+-------------------------+--------------+
| dateformat              | mdy          |
+-------------------------+--------------+
| datefirst               | 7            |
+-------------------------+--------------+
| lock_timeout            | -1           |
+-------------------------+--------------+
| quoted_identifier       | SET          |
+-------------------------+--------------+
| arithabort              | SET          |
+-------------------------+--------------+
| ansi_null_dflt_on       | SET          |
+-------------------------+--------------+
| ansi_warnings           | SET          |
+-------------------------+--------------+
| ansi_padding            | SET          |
+-------------------------+--------------+
| ansi_nulls              | SET          |
+-------------------------+--------------+
| concat_null_yields_null | SET          |
+-------------------------+--------------+
| isolation level         | serializable |
+-------------------------+--------------+

【讨论】:

  • 是当前事务还是默认的数据库设置?
  • 非常感谢。为特定事务设置事务隔离级别时,是否会覆盖数据库默认值?
  • 是的,但是是每个连接,而不是每个事务。提交后,回滚隔离级别保持在事务中定义的状态,并且不会返回到事务之前的值。
【解决方案2】:

SQL Server 中的数据库没有默认隔离级别。您在 sys.databases 中看到的是数据库是否允许快照隔离以及读取提交是乐观的(即使用快照来强制读取提交)还是悲观的。如果没有任何应用程序对其进行不同的设置,则默认隔离级别是读取提交的,而与数据库无关。

【讨论】:

    猜你喜欢
    • 2010-12-20
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    相关资源
    最近更新 更多